From 9d2417ad78257c6b0174585f341bc4d5ba7c856b Mon Sep 17 00:00:00 2001 From: Andrei F Date: Sun, 2 Mar 2014 22:51:17 +0400 Subject: [PATCH] Merge branch 'android-exynos-3.4-SEC' into perseus Conflicts: arch/arm/mach-exynos/Kconfig arch/arm/mach-exynos/board-universal5410-battery.c drivers/battery/max77803_charger.c drivers/cpufreq/exynos-ikcs-cpufreq.c drivers/hid/hid-ids.h drivers/media/video/exynos/fimg2d/fimg2d.h drivers/net/wireless/bcmdhd/Kconfig drivers/net/wireless/bcmdhd/Makefile drivers/net/wireless/bcmdhd/aiutils.c drivers/net/wireless/bcmdhd/bcmsdh_sdmmc.c drivers/net/wireless/bcmdhd/bcmsdh_sdmmc_linux.c drivers/net/wireless/bcmdhd/bcmutils.c drivers/net/wireless/bcmdhd/dhd.h drivers/net/wireless/bcmdhd/dhd_cdc.c drivers/net/wireless/bcmdhd/dhd_common.c drivers/net/wireless/bcmdhd/dhd_custom_gpio.c drivers/net/wireless/bcmdhd/dhd_custom_sec.c drivers/net/wireless/bcmdhd/dhd_linux.c drivers/net/wireless/bcmdhd/dhd_sdio.c drivers/net/wireless/bcmdhd/dhd_sec_feature.h drivers/net/wireless/bcmdhd/include/bcmdefs.h drivers/net/wireless/bcmdhd/include/bcmsdh_sdmmc.h drivers/net/wireless/bcmdhd/include/bcmutils.h drivers/net/wireless/bcmdhd/include/epivers.h drivers/net/wireless/bcmdhd/include/linux_osl.h drivers/net/wireless/bcmdhd/include/linuxver.h drivers/net/wireless/bcmdhd/linux_osl.c drivers/net/wireless/bcmdhd/wl_android.c drivers/net/wireless/bcmdhd/wl_cfg80211.c drivers/net/wireless/bcmdhd/wl_cfg80211.h drivers/net/wireless/bcmdhd/wl_cfgp2p.c --- drivers/net/wireless/bcmdhd/Kconfig | 37 +- drivers/net/wireless/bcmdhd/Makefile | 244 +- drivers/net/wireless/bcmdhd/Makefile_jbp | 356 + drivers/net/wireless/bcmdhd/aiutils.c | 43 +- drivers/net/wireless/bcmdhd/bcmevent.c | 21 +- drivers/net/wireless/bcmdhd/bcmsdh.c | 26 +- drivers/net/wireless/bcmdhd/bcmsdh_linux.c | 32 +- drivers/net/wireless/bcmdhd/bcmsdh_sdmmc.c | 118 +- .../net/wireless/bcmdhd/bcmsdh_sdmmc_linux.c | 11 +- drivers/net/wireless/bcmdhd/bcmsdspi_linux.c | 53 +- drivers/net/wireless/bcmdhd/bcmspibrcm.c | 32 +- drivers/net/wireless/bcmdhd/bcmutils.c | 142 +- .../net/wireless/bcmdhd/bcmwifi_channels.c | 105 +- .../net/wireless/bcmdhd/bcmwifi_channels.h | 10 +- drivers/net/wireless/bcmdhd/bcmwifi_rates.h | 17 +- drivers/net/wireless/bcmdhd/dhd.h | 227 +- drivers/net/wireless/bcmdhd/dhd_bta.c | 7 +- drivers/net/wireless/bcmdhd/dhd_bta.h | 2 +- drivers/net/wireless/bcmdhd/dhd_bus.h | 2 +- drivers/net/wireless/bcmdhd/dhd_cdc.c | 2547 +-- drivers/net/wireless/bcmdhd/dhd_cfg80211.c | 12 +- drivers/net/wireless/bcmdhd/dhd_cfg80211.h | 2 +- drivers/net/wireless/bcmdhd/dhd_common.c | 601 +- drivers/net/wireless/bcmdhd/dhd_custom_gpio.c | 25 +- drivers/net/wireless/bcmdhd/dhd_custom_sec.c | 158 +- drivers/net/wireless/bcmdhd/dhd_dbg.h | 9 +- drivers/net/wireless/bcmdhd/dhd_ip.c | 111 + drivers/net/wireless/bcmdhd/dhd_ip.h | 42 + drivers/net/wireless/bcmdhd/dhd_linux.c | 1206 +- drivers/net/wireless/bcmdhd/dhd_linux_sched.c | 2 +- drivers/net/wireless/bcmdhd/dhd_pno.c | 1884 ++ drivers/net/wireless/bcmdhd/dhd_pno.h | 250 + drivers/net/wireless/bcmdhd/dhd_proto.h | 11 +- drivers/net/wireless/bcmdhd/dhd_sdio.c | 745 +- drivers/net/wireless/bcmdhd/dhd_sec_feature.h | 80 +- drivers/net/wireless/bcmdhd/dhd_wlfc.c | 2502 +++ drivers/net/wireless/bcmdhd/dhd_wlfc.h | 21 +- drivers/net/wireless/bcmdhd/dngl_stats.h | 2 +- drivers/net/wireless/bcmdhd/dngl_wlhdr.h | 2 +- drivers/net/wireless/bcmdhd/hndpmu.c | 67 +- drivers/net/wireless/bcmdhd/include/Makefile | 1 + drivers/net/wireless/bcmdhd/include/aidmp.h | 15 +- drivers/net/wireless/bcmdhd/include/bcm_cfg.h | 2 +- .../wireless/bcmdhd/include/bcm_mpool_pub.h | 2 +- drivers/net/wireless/bcmdhd/include/bcmcdc.h | 2 +- drivers/net/wireless/bcmdhd/include/bcmdefs.h | 8 +- drivers/net/wireless/bcmdhd/include/bcmdevs.h | 148 +- .../net/wireless/bcmdhd/include/bcmendian.h | 2 +- .../net/wireless/bcmdhd/include/bcmnvram.h | 9 +- .../net/wireless/bcmdhd/include/bcmpcispi.h | 2 +- drivers/net/wireless/bcmdhd/include/bcmperf.h | 2 +- .../net/wireless/bcmdhd/include/bcmsdbus.h | 21 +- drivers/net/wireless/bcmdhd/include/bcmsdh.h | 11 +- .../wireless/bcmdhd/include/bcmsdh_sdmmc.h | 8 +- .../net/wireless/bcmdhd/include/bcmsdpcm.h | 2 +- .../net/wireless/bcmdhd/include/bcmsdspi.h | 2 +- .../net/wireless/bcmdhd/include/bcmsdstd.h | 4 +- drivers/net/wireless/bcmdhd/include/bcmspi.h | 2 +- .../net/wireless/bcmdhd/include/bcmspibrcm.h | 8 +- .../net/wireless/bcmdhd/include/bcmsrom_fmt.h | 15 +- .../net/wireless/bcmdhd/include/bcmsrom_tbl.h | 111 +- .../net/wireless/bcmdhd/include/bcmutils.h | 54 +- drivers/net/wireless/bcmdhd/include/dbus.h | 4 +- .../net/wireless/bcmdhd/include/dhdioctl.h | 9 +- drivers/net/wireless/bcmdhd/include/epivers.h | 18 +- drivers/net/wireless/bcmdhd/include/hndpmu.h | 4 +- .../wireless/bcmdhd/include/hndrte_armtrap.h | 2 +- .../net/wireless/bcmdhd/include/hndrte_cons.h | 6 +- drivers/net/wireless/bcmdhd/include/hndsoc.h | 2 +- .../net/wireless/bcmdhd/include/linux_osl.h | 58 +- .../net/wireless/bcmdhd/include/linuxver.h | 38 +- drivers/net/wireless/bcmdhd/include/miniopt.h | 2 +- .../net/wireless/bcmdhd/include/msgtrace.h | 11 +- drivers/net/wireless/bcmdhd/include/osl.h | 13 +- .../bcmdhd/include/packed_section_end.h | 2 +- .../bcmdhd/include/packed_section_start.h | 2 +- drivers/net/wireless/bcmdhd/include/pcicfg.h | 2 +- .../wireless/bcmdhd/include/proto/802.11.h | 1230 +- .../bcmdhd/include/proto/802.11_bta.h | 4 +- .../wireless/bcmdhd/include/proto/802.11e.h | 7 +- .../wireless/bcmdhd/include/proto/802.1d.h | 4 +- .../net/wireless/bcmdhd/include/proto/802.3.h | 52 + .../wireless/bcmdhd/include/proto/bcmeth.h | 4 +- .../wireless/bcmdhd/include/proto/bcmevent.h | 186 +- .../net/wireless/bcmdhd/include/proto/bcmip.h | 24 +- .../wireless/bcmdhd/include/proto/bcmipv6.h | 47 +- .../bcmdhd/include/proto/bt_amp_hci.h | 4 +- .../net/wireless/bcmdhd/include/proto/eapol.h | 2 +- .../wireless/bcmdhd/include/proto/ethernet.h | 57 +- .../net/wireless/bcmdhd/include/proto/p2p.h | 8 +- .../net/wireless/bcmdhd/include/proto/sdspi.h | 4 +- .../net/wireless/bcmdhd/include/proto/vlan.h | 28 +- .../net/wireless/bcmdhd/include/proto/wpa.h | 16 +- .../net/wireless/bcmdhd/include/proto/wps.h | 2 +- drivers/net/wireless/bcmdhd/include/sbchipc.h | 292 +- .../net/wireless/bcmdhd/include/sbconfig.h | 2 +- .../net/wireless/bcmdhd/include/sbhnddma.h | 23 +- .../net/wireless/bcmdhd/include/sbpcmcia.h | 4 +- drivers/net/wireless/bcmdhd/include/sbsdio.h | 6 +- .../net/wireless/bcmdhd/include/sbsdpcmdev.h | 2 +- .../net/wireless/bcmdhd/include/sbsocram.h | 2 +- drivers/net/wireless/bcmdhd/include/sdio.h | 2 +- drivers/net/wireless/bcmdhd/include/sdioh.h | 2 +- drivers/net/wireless/bcmdhd/include/sdiovar.h | 2 +- drivers/net/wireless/bcmdhd/include/siutils.h | 24 +- drivers/net/wireless/bcmdhd/include/spid.h | 2 +- drivers/net/wireless/bcmdhd/include/trxhdr.h | 2 +- .../net/wireless/bcmdhd/include/typedefs.h | 7 +- .../net/wireless/bcmdhd/include/wlfc_proto.h | 14 +- drivers/net/wireless/bcmdhd/include/wlioctl.h | 340 +- drivers/net/wireless/bcmdhd/linux_osl.c | 154 +- drivers/net/wireless/bcmdhd/sbutils.c | 9 +- drivers/net/wireless/bcmdhd/siutils.c | 46 +- drivers/net/wireless/bcmdhd/siutils_priv.h | 5 +- drivers/net/wireless/bcmdhd/uamp_api.h | 2 +- drivers/net/wireless/bcmdhd/wl_android.c | 1042 +- drivers/net/wireless/bcmdhd/wl_android.h | 13 +- drivers/net/wireless/bcmdhd/wl_cfg80211.c | 2244 ++- drivers/net/wireless/bcmdhd/wl_cfg80211.h | 165 +- drivers/net/wireless/bcmdhd/wl_cfgp2p.c | 360 +- drivers/net/wireless/bcmdhd/wl_cfgp2p.h | 83 +- drivers/net/wireless/bcmdhd/wl_dbg.h | 4 +- drivers/net/wireless/bcmdhd/wl_iw.c | 45 +- drivers/net/wireless/bcmdhd/wl_iw.h | 2 +- drivers/net/wireless/bcmdhd/wl_linux_mon.c | 2 +- drivers/net/wireless/bcmdhd/wl_roam.c | 8 +- drivers/net/wireless/bcmdhd/wldev_common.c | 33 +- drivers/net/wireless/bcmdhd/wldev_common.h | 7 +- .../sensorhub/factory/temphumidity_shtc1.c | 4 +- drivers/sensorhub/ssp.h | 2 +- drivers/sensorhub/ssp_firmware.c | 2 +- drivers/sensorhub/ssp_sysfs.c | 58 +- firmware/ssp.fw.ihex | 15982 ++++++++-------- 133 files changed, 21880 insertions(+), 13165 deletions(-) create mode 100644 drivers/net/wireless/bcmdhd/Makefile_jbp create mode 100644 drivers/net/wireless/bcmdhd/dhd_ip.c create mode 100644 drivers/net/wireless/bcmdhd/dhd_ip.h create mode 100644 drivers/net/wireless/bcmdhd/dhd_pno.c create mode 100644 drivers/net/wireless/bcmdhd/dhd_pno.h create mode 100644 drivers/net/wireless/bcmdhd/dhd_wlfc.c create mode 100644 drivers/net/wireless/bcmdhd/include/proto/802.3.h diff --git a/drivers/net/wireless/bcmdhd/Kconfig b/drivers/net/wireless/bcmdhd/Kconfig index 3a8c69d4c73..421f358bdbb 100644 --- a/drivers/net/wireless/bcmdhd/Kconfig +++ b/drivers/net/wireless/bcmdhd/Kconfig @@ -19,6 +19,13 @@ config BCM4335 This module adds support for wireless adapters based on Broadcom 4335 chipset. +config BCM4339 + tristate "Broadcom 4339 wireless cards support" + depends on WLAN + ---help--- + This module adds support for wireless adapters based on + Broadcom 4339 chipset. + config BCM43241 tristate "Broadcom 43241 wireless cards support" depends on WLAN @@ -71,7 +78,7 @@ config DHD_USE_SCHED_SCAN config BROADCOM_WIFI_RESERVED_MEM bool "BROADCOM Reserved memory for wifi device" - depends on (BCM4330 || BCM4334 || BCM4335 || BCM43241) + depends on (BCM4330 || BCM4334 || BCM4335 || BCM4339 || BCM43241) ---help--- This is a configuration for broadcom WLAN driver. @@ -82,9 +89,15 @@ config BCM4335BT ---help--- This is a configuration for bt lock enable. +config WIFI_BROADCOM_COB + bool "BROADCOM COB type chip is enabled" + depends on (BCM4330 || BCM4334 || BCM4335 || BCM4339 || BCM43241) + ---help--- + This is a configuration for COB type feature. + config WLAN_REGION_CODE int "---Region codes for Broadcom WiFi Driver" - depends on (BCM4330 || BCM4334 || BCM4335 || BCM43241) + depends on (BCM4330 || BCM4334 || BCM4335 || BCM4339 || BCM43241) default 100 ---help--- This is a region code for Broadcom Wi-Fi featured functions. @@ -95,3 +108,23 @@ config WLAN_REGION_CODE - 202 : KOR KTT - 203 : KOR LGT - 300 : CHN OPEN + - 400 : USA OPEN + - 401 : USA ATT + - 402 : USA TMO + - 403 : USA VZW + - 404 : USA SPR + - 405 : USA USC + +config WIFI_2GHZ_VHT_NO_SUPPORT + bool "BROADCOM Reserved memory for wifi device" + depends on BCM4339 + default n + ---help--- + This is a configuration for 2GHZ VHT mode. + +config WLAIBSS + bool "Advanced IBSS mode" + depends on (BCM4335 || BCM4339) + default y + ---help--- + This is a configuration for Oxygen Network. diff --git a/drivers/net/wireless/bcmdhd/Makefile b/drivers/net/wireless/bcmdhd/Makefile index afc29beb45b..6914824c42f 100644 --- a/drivers/net/wireless/bcmdhd/Makefile +++ b/drivers/net/wireless/bcmdhd/Makefile @@ -17,19 +17,55 @@ DHDCFLAGS += -Wall -Wstrict-prototypes -Dlinux -DLINUX -DBCMDRIVER \ ################# DHDCFLAGS += -DCUSTOMER_HW4 -DHDCFLAGS += -DDEBUGFS_CFG80211 -DHDCFLAGS += -DBLOCK_IPV6_PACKET -DPASS_IPV4_SUSPEND -DHDCFLAGS += -DSUPPORT_DEEP_SLEEP +DHDCFLAGS += -DWL_CFG80211 + +# Debug DHDCFLAGS += -DSIMPLE_MAC_PRINT +DHDCFLAGS += -DDEBUGFS_CFG80211 +# Print out kernel panic point of file and line info when assertion happened +DHDCFLAGS += -DBCMASSERT_LOG -# Print out kernel panic point of file and line info when assertion happened -DHDCFLAGS += -DBCMASSERT_LOG # Print 8021X DHDCFLAGS += -DDHD_8021X_DUMP +# VSDB +DHDCFLAGS += -DVSDB +DHDCFLAGS += -DPROP_TXSTATUS + +# Wi-Fi Direct +DHDCFLAGS += -DWL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST # For p2p connection issue -DHDCFLAGS += -DWL_CFG80211_GON_COLLISION DHDCFLAGS += -DWL_SCB_TIMEOUT=10 +# For TDLS tear down inactive time 10 sec +DHDCFLAGS += -DCUSTOM_TDLS_IDLE_MODE_SETTING=10000 +# for TDLS RSSI HIGH for establishing TDLS link +DHDCFLAGS += -DCUSTOM_TDLS_RSSI_THRESHOLD_HIGH=-80 +# for TDLS RSSI HIGH for tearing down TDLS link +DHDCFLAGS += -DCUSTOM_TDLS_RSSI_THRESHOLD_LOW=-85 + +# Roaming +DHDCFLAGS += -DROAM_AP_ENV_DETECTION +DHDCFLAGS += -DROAM_ENABLE -DROAM_CHANNEL_CACHE -DROAM_API +DHDCFLAGS += -DENABLE_FW_ROAM_SUSPEND + +# CCX +ifeq ($(CONFIG_BRCM_CCX),y) + DHDCFLAGS += -DBCMCCX +endif + +# SoftAP +DHDCFLAGS += -DWL_SUPPORT_AUTO_CHANNEL -DSUPPORT_HIDDEN_AP +DHDCFLAGS += -DSUPPORT_SOFTAP_SINGL_DISASSOC +DHDCFLAGS += -DDISABLE_11H_SOFTAP + +# HW4 specific features +DHDCFLAGS += -DSUPPORT_PM2_ONLY +DHDCFLAGS += -DSUPPORT_DEEP_SLEEP +DHDCFLAGS += -DSUPPORT_AMPDU_MPDU_CMD +DHDCFLAGS += -DBLOCK_IPV6_PACKET -DPASS_IPV4_SUSPEND + +# For special PNO Event keep wake lock for 10sec +DHDCFLAGS += -DCUSTOM_PNO_EVENT_LOCK_xTIME=10 # For Passing all multicast packets to host when not in suspend mode. DHDCFLAGS += -DPASS_ALL_MCAST_PKTS @@ -37,15 +73,13 @@ DHDCFLAGS += -DPASS_ALL_MCAST_PKTS # Early suspend DHDCFLAGS += -DDHD_USE_EARLYSUSPEND -DHDCFLAGS += -DSUPPORT_PM2_ONLY +# WiFi turn off delay +DHDCFLAGS += -DWIFI_TURNOFF_DELAY=100 # For Scan result patch DHDCFLAGS += -DESCAN_RESULT_PATCH DHDCFLAGS += -DDUAL_ESCAN_RESULT_BUFFER -DHDCFLAGS += -DROAM_ENABLE -DROAM_CHANNEL_CACHE -DROAM_API -DHDCFLAGS += -DENABLE_FW_ROAM_SUSPEND - # For Static Buffer ifeq ($(CONFIG_BROADCOM_WIFI_RESERVED_MEM),y) DHDCFLAGS += -DCONFIG_DHD_USE_STATIC_BUF @@ -53,17 +87,11 @@ ifeq ($(CONFIG_BROADCOM_WIFI_RESERVED_MEM),y) DHDCFLAGS += -DSTATIC_WL_PRIV_STRUCT endif -# For CCX -ifeq ($(CONFIG_BRCM_CCX),y) - DHDCFLAGS += -DBCMCCX -endif - -DHDCFLAGS += -DWL_CFG80211 +# DTIM listen interval in suspend mode(0 means follow AP's DTIM period) +DHDCFLAGS += -DCUSTOM_SUSPEND_BCN_LI_DTIM=0 -# SoftAP -DHDCFLAGS += -DSUPPORT_AUTO_CHANNEL -DSUPPORT_HIDDEN_AP -DHDCFLAGS += -DSUPPORT_SOFTAP_SINGL_DISASSOC -DHDCFLAGS += -DDISABLE_11H_SOFTAP +# Ioctl timeout 5000ms +DHDCFLAGS += -DIOCTL_RESP_TIMEOUT=5000 # DPC priority ifeq ($(CONFIG_MACH_JF),y) @@ -72,32 +100,32 @@ else DHDCFLAGS += -DCUSTOM_DPC_PRIO_SETTING=98 endif -# WiFi turn off delay -DHDCFLAGS += -DWIFI_TURNOFF_DELAY=100 - -# DTIM listen interval in suspend mode(0 means follow AP's DTIM period) -DHDCFLAGS += -DCUSTOM_SUSPEND_BCN_LI_DTIM=0 - # Priority mismatch fix with kernel stack DHDCFLAGS += -DPKTPRIO_OVERRIDE -# Ioctl timeout 5000ms -DHDCFLAGS += -DIOCTL_RESP_TIMEOUT=5000 +# Prevent rx thread monopolize +DHDCFLAGS += -DWAIT_DEQUEUE + +# Config PM Control +DHDCFLAGS += -DCONFIG_CONTROL_PM + +# idle count +DHDCFLAGS += -DDHD_USE_IDLECOUNT # Used short dwell time during initial scan DHDCFLAGS += -DUSE_INITIAL_SHORT_DWELL_TIME -############ -# JellyBean -############ +########## +# KitKat +########## +# Definitions are filtered by Kernel version DHDCFLAGS += -DWL_ENABLE_P2P_IF -DHDCFLAGS += -DMULTIPLE_SUPPLICANT -DHDCFLAGS += -DWL_CFG80211_STA_EVENT - -################# -# JellyBean Plus -################# DHDCFLAGS += -DWL_SUPPORT_BACKPORTED_KPATCHES +# Default definitions for KitKat +DHDCFLAGS += -DWL_CFG80211_STA_EVENT +DHDCFLAGS += -DWL_IFACE_COMB_NUM_CHANNELS +# To support p2p private command on kernel 3.8 or above +DHDCFLAGS += -DWL_NEWCFG_PRIVCMD_SUPPORT ########################## # driver type @@ -110,43 +138,92 @@ DRIVER_TYPE ?= m # Chip dependent feature ######################### -ifneq ($(CONFIG_BCM4335),) - DHDCFLAGS += -DBCM4335_CHIP -DHW_OOB -DSUPPORT_MULTIPLE_REVISION - DHDCFLAGS += -DDHD_USE_IDLECOUNT - DHDCFLAGS += -DSUPPORT_AMPDU_MPDU_CMD - DHDCFLAGS += -DUSE_DYNAMIC_F2_BLKSIZE -DDYNAMIC_F2_BLKSIZE_FOR_NONLEGACY=128 - DHDCFLAGS += -DUSE_CID_CHECK -DCONFIG_CONTROL_PM - DHDCFLAGS += -DPROP_TXSTATUS -DPROP_TXSTATUS_VSDB - DHDCFLAGS += -DVSDB - DHDCFLAGS += -DWL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST +ifneq ($(CONFIG_BCM4339),) + DHDCFLAGS += -DBCM4339_CHIP -DHW_OOB + DHDCFLAGS += -DUSE_CID_CHECK + DHDCFLAGS += -DENABLE_BCN_LI_BCN_WAKEUP + DHDCFLAGS += -DSDIO_CRC_ERROR_FIX + + # tput enhancement DHDCFLAGS += -DCUSTOM_GLOM_SETTING=8 -DCUSTOM_RXCHAIN=1 - DHDCFLAGS += -DENABLE_BCN_LI_BCN_WAKEUP - DHDCFLAGS += -DROAM_AP_ENV_DETECTION + DHDCFLAGS += -DUSE_DYNAMIC_F2_BLKSIZE -DDYNAMIC_F2_BLKSIZE_FOR_NONLEGACY=128 DHDCFLAGS += -DBCMSDIOH_TXGLOM -DCUSTOM_TXGLOM=1 -DBCMSDIOH_TXGLOM_HIGHSPEED DHDCFLAGS += -DDHDTCPACK_SUPPRESS -# DHDCFLAGS += -DDHD_SET_FW_HIGHSPEED DHDCFLAGS += -DUSE_WL_TXBF DHDCFLAGS += -DUSE_WL_FRAMEBURST - DHDCFLAGS += -DSDIO_CRC_ERROR_FIX DHDCFLAGS += -DRXFRAME_THREAD - DHDCFLAGS += -DREPEAT_READFRAME + DHDCFLAGS += -DCUSTOM_AMPDU_BA_WSIZE=64 -DCUSTOM_IBSS_AMPDU_BA_WSIZE=16 DHDCFLAGS += -DCUSTOM_DPC_CPUCORE=0 - DHDCFLAGS += -DCUSTOM_AMPDU_BA_WSIZE=64 + DHDCFLAGS += -DPROP_TXSTATUS_VSDB +ifeq ($(CONFIG_ARCH_MSM),y) + DHDCFLAGS += -DCUSTOM_DEF_TXGLOM_SIZE=32 -DDHD_TXBOUND=32 + DHDCFLAGS += -DENABLE_ADAPTIVE_SCHED -DCUSTOM_CPUFREQ_THRESH=1000000 +endif + DHDCFLAGS += -DCUSTOM_MAX_TXGLOM_SIZE=32 + + # New Features DHDCFLAGS += -DWL11U DHDCFLAGS += -DBCMCCX DHDCFLAGS += -DWES_SUPPORT DHDCFLAGS += -DOKC_SUPPORT DHDCFLAGS += -DWLTDLS -# DHDCFLAGS += -DTPUT_DEBUG DHDCFLAGS += -DWLFBT - DHDCFLAGS += -DSUPPORT_IBSS + DHDCFLAGS += -DDHD_ENABLE_LPC + DHDCFLAGS += -DWLAIBSS DHDCFLAGS += -DSUPPORT_LTECX +ifneq ($(CONFIG_2GHZ_VHT_NO_SUPPORT),y) DHDCFLAGS += -DSUPPORT_2G_VHT +endif DHDCFLAGS += -DSUPPORT_WL_TXPOWER + DHDCFLAGS += -DBCMCCX_S69 +ifeq ($(CONFIG_BCM4339),y) + DHDCFLAGS += -DENABLE_INSMOD_NO_FW_LOAD + DHDCFLAGS += -DUSE_LATE_INITCALL_SYNC + DRIVER_TYPE = y +endif +endif + +ifneq ($(CONFIG_BCM4335),) + DHDCFLAGS += -DBCM4335_CHIP -DHW_OOB -DSUPPORT_MULTIPLE_REVISION + DHDCFLAGS += -DUSE_CID_CHECK + DHDCFLAGS += -DENABLE_BCN_LI_BCN_WAKEUP + DHDCFLAGS += -DSDIO_CRC_ERROR_FIX + + # tput enhancement + DHDCFLAGS += -DCUSTOM_GLOM_SETTING=8 -DCUSTOM_RXCHAIN=1 + DHDCFLAGS += -DUSE_DYNAMIC_F2_BLKSIZE -DDYNAMIC_F2_BLKSIZE_FOR_NONLEGACY=128 + DHDCFLAGS += -DBCMSDIOH_TXGLOM -DCUSTOM_TXGLOM=1 -DBCMSDIOH_TXGLOM_HIGHSPEED + DHDCFLAGS += -DDHDTCPACK_SUPPRESS +# DHDCFLAGS += -DDHD_SET_FW_HIGHSPEED + DHDCFLAGS += -DUSE_WL_TXBF + DHDCFLAGS += -DUSE_WL_FRAMEBURST + DHDCFLAGS += -DRXFRAME_THREAD + DHDCFLAGS += -DREPEAT_READFRAME + DHDCFLAGS += -DCUSTOM_AMPDU_BA_WSIZE=64 + DHDCFLAGS += -DCUSTOM_DPC_CPUCORE=0 + DHDCFLAGS += -DPROP_TXSTATUS_VSDB +# DHDCFLAGS += -DTPUT_DEBUG ifeq ($(CONFIG_MACH_JF),y) - DHDCFLAGS += -DCUSTOM_TXGLOM_SIZE=32 -DDHD_TXBOUND=32 + DHDCFLAGS += -DCUSTOM_DEF_TXGLOM_SIZE=32 -DDHD_TXBOUND=32 +endif +ifeq ($(CONFIG_ARCH_MSM),y) + DHDCFLAGS += -DCUSTOM_DEF_TXGLOM_SIZE=32 -DDHD_TXBOUND=32 + DHDCFLAGS += -DENABLE_ADAPTIVE_SCHED -DCUSTOM_CPUFREQ_THRESH=1000000 endif DHDCFLAGS += -DCUSTOM_MAX_TXGLOM_SIZE=32 + + # New Features + DHDCFLAGS += -DWL11U + DHDCFLAGS += -DBCMCCX + DHDCFLAGS += -DWES_SUPPORT + DHDCFLAGS += -DOKC_SUPPORT + DHDCFLAGS += -DWLTDLS -DWLTDLS_AUTO_ENABLE + DHDCFLAGS += -DWLFBT + DHDCFLAGS += -DDHD_ENABLE_LPC + DHDCFLAGS += -DWLAIBSS + DHDCFLAGS += -DSUPPORT_LTECX + DHDCFLAGS += -DSUPPORT_2G_VHT + DHDCFLAGS += -DSUPPORT_WL_TXPOWER # For BT LOCK ifeq ($(CONFIG_BCM4335BT),y) DHDCFLAGS += -DENABLE_4335BT_WAR @@ -156,21 +233,15 @@ ifeq ($(CONFIG_BCM4335),y) DHDCFLAGS += -DUSE_LATE_INITCALL_SYNC DRIVER_TYPE = y endif - # Remove define for BCM4335 - DHDCFLAGS :=$(filter-out -DWL_CFG80211_GON_COLLISION,$(DHDCFLAGS)) endif ifneq ($(CONFIG_BCM4334),) DHDCFLAGS += -DBCM4334_CHIP -DHW_OOB -DSUPPORT_MULTIPLE_REVISION - DHDCFLAGS += -DUSE_CID_CHECK -DCONFIG_CONTROL_PM - DHDCFLAGS += -DPROP_TXSTATUS -DPROP_TXSTATUS_VSDB - DHDCFLAGS += -DVSDB - DHDCFLAGS += -DWL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST - DHDCFLAGS += -DDHD_USE_IDLECOUNT - DHDCFLAGS += -DSUPPORT_AMPDU_MPDU_CMD + DHDCFLAGS += -DUSE_CID_CHECK + DHDCFLAGS += -DENABLE_BCN_LI_BCN_WAKEUP DHDCFLAGS += -DUSE_DYNAMIC_F2_BLKSIZE -DDYNAMIC_F2_BLKSIZE_FOR_NONLEGACY=64 - DHDCFLAGS += -DCUSTOM_GLOM_SETTING=5 -DENABLE_BCN_LI_BCN_WAKEUP - DHDCFLAGS += -DROAM_AP_ENV_DETECTION + DHDCFLAGS += -DCUSTOM_GLOM_SETTING=5 + DHDCFLAGS += -DPROP_TXSTATUS_VSDB DHDCFLAGS += -DWES_SUPPORT DHDCFLAGS += -DSUPPORT_WL_TXPOWER ifeq ($(CONFIG_BCM4334),y) @@ -178,38 +249,35 @@ ifeq ($(CONFIG_BCM4334),y) DHDCFLAGS += -DUSE_LATE_INITCALL_SYNC DRIVER_TYPE = y endif - DHDCFLAGS :=$(filter-out -DWL_CFG80211_GON_COLLISION,$(DHDCFLAGS)) endif ifneq ($(CONFIG_BCM4330),) - DHDCFLAGS += -DBCM4330_CHIP + DHDCFLAGS += -DBCM4330_CHIP -DSUPPORT_MULTIPLE_REVISION DHDCFLAGS += -DMCAST_LIST_ACCUMULATION - DHDCFLAGS += -DCONFIG_CONTROL_PM DHDCFLAGS += -DCUSTOM_GLOM_SETTING=0 - DHDCFLAGS += -DWL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST + DHDCFLAGS += -DWL_CFG80211_GON_COLLISION ifeq ($(CONFIG_BCM4330),y) DHDCFLAGS += -DENABLE_INSMOD_NO_FW_LOAD DHDCFLAGS += -DUSE_LATE_INITCALL_SYNC DRIVER_TYPE = y endif + # Remove common feature for BCM4330 + DHDCFLAGS :=$(filter-out -DSUPPORT_AMPDU_MPDU_CMD,$(DHDCFLAGS)) + DHDCFLAGS :=$(filter-out -DVSDB,$(DHDCFLAGS)) + DHDCFLAGS :=$(filter-out -DPROP_TXSTATUS,$(DHDCFLAGS)) + DHDCFLAGS :=$(filter-out -DROAM_AP_ENV_DETECTION,$(DHDCFLAGS)) + DHDCFLAGS :=$(filter-out -DDHD_USE_IDLECOUNT,$(DHDCFLAGS)) endif ifneq ($(CONFIG_BCM43241),) DHDCFLAGS += -DBCM43241_CHIP -DHW_OOB - DHDCFLAGS += -DCONFIG_CONTROL_PM - DHDCFLAGS += -DPROP_TXSTATUS - DHDCFLAGS += -DVSDB - DHDCFLAGS += -DWL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST - DHDCFLAGS += -DDHD_USE_IDLECOUNT - DHDCFLAGS += -DSUPPORT_AMPDU_MPDU_CMD - DHDCFLAGS += -DMIMO_ANT_SETTING -DAMPDU_HOSTREORDER + DHDCFLAGS += -DMIMO_ANT_SETTING DHDCFLAGS += -DCUSTOM_GLOM_SETTING=1 -DCUSTOM_SDIO_F2_BLKSIZE=128 - DHDCFLAGS += -DROAM_AP_ENV_DETECTION DHDCFLAGS += -DSDIO_CRC_ERROR_FIX - DHDCFLAGS :=$(filter-out -DWL_CFG80211_GON_COLLISION,$(DHDCFLAGS)) - ifeq ($(CONFIG_BCM43241),m) - DHDCFLAGS += -fno-pic - endif + DHDCFLAGS += -DAMPDU_HOSTREORDER +ifeq ($(CONFIG_BCM43241),m) + DHDCFLAGS += -fno-pic +endif ifeq ($(CONFIG_BCM43241),y) DHDCFLAGS += -DENABLE_INSMOD_NO_FW_LOAD DHDCFLAGS += -DUSE_LATE_INITCALL_SYNC @@ -223,7 +291,8 @@ endif ############################# ifeq ($(CONFIG_SPI_SC8810),y) - DHDCFLAGS += -DREAD_MACADDR -DBCMSPI -DBCMSPI_ANDROID -DSPI_PIO_32BIT_RW -DSPI_PIO_RW_BIGENDIAN -DDISABLE_11N + DHDCFLAGS += -DREAD_MACADDR -DBCMSPI -DBCMSPI_ANDROID -DSPI_PIO_32BIT_RW -DSPI_PIO_RW_BIGENDIAN + DHDCFLAGS += -UCUSTOM_DPC_PRIO_SETTING #Remove defines for SDMMC DHDCFLAGS :=$(filter-out -DOOB_INTR_ONLY,$(DHDCFLAGS)) @@ -249,10 +318,6 @@ ifeq ($(GGSM_WIFI_5GHz_CHANNELS),true) DHDCFLAGS += -DCUSTOMER_SET_COUNTRY endif -ifeq ($(CONFIG_TARGET_LOCALE_CHN),y) - DHDCFLAGS += -DBCMWAPI_WPI -DBCMWAPI_WAI -endif - ############################################################## # dhd_sec_feature.h DHDCFLAGS += -include "dhd_sec_feature.h" @@ -262,10 +327,7 @@ DHDCFLAGS += -include "dhd_sec_feature.h" # Others ######### -ifneq ($(CONFIG_ARCH_EXYNOS),y) -# Not needed in Exynos -EXTRA_LDFLAGS += --strip-debug -endif +#EXTRA_LDFLAGS += --strip-debug EXTRA_CFLAGS += $(DHDCFLAGS) -DDHD_DEBUG EXTRA_CFLAGS += -DSRCBASE=\"$(src)\" @@ -273,7 +335,7 @@ EXTRA_CFLAGS += -I$(src)/include/ -I$(src)/ KBUILD_CFLAGS += -I$(LINUXDIR)/include -I$(shell pwd) DHDOFILES := bcmsdh.o bcmsdh_linux.o bcmsdh_sdmmc.o bcmsdh_sdmmc_linux.o \ - dhd_cdc.o dhd_common.o dhd_custom_gpio.o dhd_custom_sec.o \ + dhd_cdc.o dhd_pno.o dhd_common.o dhd_wlfc.o dhd_ip.o dhd_custom_gpio.o dhd_custom_sec.o \ dhd_linux.o dhd_linux_sched.o dhd_cfg80211.o dhd_sdio.o aiutils.o bcmevent.o \ bcmutils.o bcmwifi_channels.o hndpmu.o linux_osl.o sbutils.o siutils.o \ wl_android.o wl_cfg80211.o wl_cfgp2p.o wldev_common.o wl_linux_mon.o wl_roam.o diff --git a/drivers/net/wireless/bcmdhd/Makefile_jbp b/drivers/net/wireless/bcmdhd/Makefile_jbp new file mode 100644 index 00000000000..ea433a80132 --- /dev/null +++ b/drivers/net/wireless/bcmdhd/Makefile_jbp @@ -0,0 +1,356 @@ +# bcmdhd +##################### +# SDIO Basic feature +##################### + +DHDCFLAGS = -Wall -Wstrict-prototypes -Dlinux -DLINUX -DBCMDRIVER \ + -DBCMDONGLEHOST -DUNRELEASEDCHIP -DBCMDMA32 -DBCMFILEIMAGE \ + -DDHDTHREAD -DBDC -DOOB_INTR_ONLY \ + -DDHD_BCMEVENTS -DSHOW_EVENTS -DBCMDBG \ + -DMMC_SDIO_ABORT -DBCMSDIO -DBCMLXSDMMC -DBCMPLATFORM_BUS -DWLP2P \ + -DWIFI_ACT_FRAME -DARP_OFFLOAD_SUPPORT \ + -DKEEP_ALIVE -DCSCAN -DPKT_FILTER_SUPPORT \ + -DEMBEDDED_PLATFORM -DPNO_SUPPORT + +################# +# Common feature +################# + +DHDCFLAGS += -DCUSTOMER_HW4 +DHDCFLAGS += -DWL_CFG80211 + +# Debug +DHDCFLAGS += -DSIMPLE_MAC_PRINT +DHDCFLAGS += -DDEBUGFS_CFG80211 +# Print out kernel panic point of file and line info when assertion happened +DHDCFLAGS += -DBCMASSERT_LOG + +# Print 8021X +DHDCFLAGS += -DDHD_8021X_DUMP + +# VSDB +DHDCFLAGS += -DVSDB +DHDCFLAGS += -DPROP_TXSTATUS + +# Wi-Fi Direct +DHDCFLAGS += -DWL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST +# For p2p connection issue +DHDCFLAGS += -DWL_SCB_TIMEOUT=10 +# For TDLS tear down inactive time 10 sec +DHDCFLAGS += -DCUSTOM_TDLS_IDLE_MODE_SETTING=10000 +# for TDLS RSSI HIGH for establishing TDLS link +DHDCFLAGS += -DCUSTOM_TDLS_RSSI_THRESHOLD_HIGH=-80 +# for TDLS RSSI HIGH for tearing down TDLS link +DHDCFLAGS += -DCUSTOM_TDLS_RSSI_THRESHOLD_LOW=-85 + +# Roaming +DHDCFLAGS += -DROAM_AP_ENV_DETECTION +DHDCFLAGS += -DROAM_ENABLE -DROAM_CHANNEL_CACHE -DROAM_API +DHDCFLAGS += -DENABLE_FW_ROAM_SUSPEND + +# CCX +ifeq ($(CONFIG_BRCM_CCX),y) + DHDCFLAGS += -DBCMCCX +endif + +# SoftAP +DHDCFLAGS += -DWL_SUPPORT_AUTO_CHANNEL -DSUPPORT_HIDDEN_AP +DHDCFLAGS += -DSUPPORT_SOFTAP_SINGL_DISASSOC +DHDCFLAGS += -DDISABLE_11H_SOFTAP + +# HW4 specific features +DHDCFLAGS += -DSUPPORT_PM2_ONLY +DHDCFLAGS += -DSUPPORT_DEEP_SLEEP +DHDCFLAGS += -DSUPPORT_AMPDU_MPDU_CMD +DHDCFLAGS += -DBLOCK_IPV6_PACKET -DPASS_IPV4_SUSPEND + +# For special PNO Event keep wake lock for 10sec +DHDCFLAGS += -DCUSTOM_PNO_EVENT_LOCK_xTIME=10 + +# For Passing all multicast packets to host when not in suspend mode. +DHDCFLAGS += -DPASS_ALL_MCAST_PKTS + +# Early suspend +DHDCFLAGS += -DDHD_USE_EARLYSUSPEND + +# WiFi turn off delay +DHDCFLAGS += -DWIFI_TURNOFF_DELAY=100 + +# For Scan result patch +DHDCFLAGS += -DESCAN_RESULT_PATCH +DHDCFLAGS += -DDUAL_ESCAN_RESULT_BUFFER + +# For Static Buffer +ifeq ($(CONFIG_BROADCOM_WIFI_RESERVED_MEM),y) + DHDCFLAGS += -DCONFIG_DHD_USE_STATIC_BUF + DHDCFLAGS += -DENHANCED_STATIC_BUF + DHDCFLAGS += -DSTATIC_WL_PRIV_STRUCT +endif + +# DTIM listen interval in suspend mode(0 means follow AP's DTIM period) +DHDCFLAGS += -DCUSTOM_SUSPEND_BCN_LI_DTIM=0 + +# Ioctl timeout 5000ms +DHDCFLAGS += -DIOCTL_RESP_TIMEOUT=5000 + +# DPC priority +DHDCFLAGS += -DCUSTOM_DPC_PRIO_SETTING=98 + +# Priority mismatch fix with kernel stack +DHDCFLAGS += -DPKTPRIO_OVERRIDE + +# Prevent rx thread monopolize +DHDCFLAGS += -DWAIT_DEQUEUE + +# Config PM Control +DHDCFLAGS += -DCONFIG_CONTROL_PM + +# idle count +DHDCFLAGS += -DDHD_USE_IDLECOUNT + +# Used short dwell time during initial scan +DHDCFLAGS += -DUSE_INITIAL_SHORT_DWELL_TIME + +############ +# JellyBean +############ +DHDCFLAGS += -DWL_ENABLE_P2P_IF +DHDCFLAGS += -DMULTIPLE_SUPPLICANT +DHDCFLAGS += -DWL_CFG80211_STA_EVENT + +################# +# JellyBean Plus +################# +DHDCFLAGS += -DWL_SUPPORT_BACKPORTED_KPATCHES + +########################## +# driver type +# m: module type driver +# y: built-in type driver +########################## +DRIVER_TYPE ?= m + +######################### +# Chip dependent feature +######################### + +ifneq ($(CONFIG_BCM4339),) + DHDCFLAGS += -DBCM4339_CHIP -DHW_OOB + DHDCFLAGS += -DUSE_CID_CHECK + DHDCFLAGS += -DENABLE_BCN_LI_BCN_WAKEUP + DHDCFLAGS += -DSDIO_CRC_ERROR_FIX + + # tput enhancement + DHDCFLAGS += -DCUSTOM_GLOM_SETTING=8 -DCUSTOM_RXCHAIN=1 + DHDCFLAGS += -DUSE_DYNAMIC_F2_BLKSIZE -DDYNAMIC_F2_BLKSIZE_FOR_NONLEGACY=128 + DHDCFLAGS += -DBCMSDIOH_TXGLOM -DCUSTOM_TXGLOM=1 -DBCMSDIOH_TXGLOM_HIGHSPEED + DHDCFLAGS += -DDHDTCPACK_SUPPRESS + DHDCFLAGS += -DUSE_WL_TXBF + DHDCFLAGS += -DUSE_WL_FRAMEBURST + DHDCFLAGS += -DRXFRAME_THREAD + DHDCFLAGS += -DCUSTOM_AMPDU_BA_WSIZE=64 -DCUSTOM_IBSS_AMPDU_BA_WSIZE=16 + DHDCFLAGS += -DCUSTOM_DPC_CPUCORE=0 + DHDCFLAGS += -DPROP_TXSTATUS_VSDB +ifeq ($(CONFIG_ARCH_MSM),y) + DHDCFLAGS += -DCUSTOM_DEF_TXGLOM_SIZE=32 -DDHD_TXBOUND=32 + DHDCFLAGS += -DENABLE_ADAPTIVE_SCHED -DCUSTOM_CPUFREQ_THRESH=1000000 +endif + DHDCFLAGS += -DCUSTOM_MAX_TXGLOM_SIZE=32 + + # New Features + DHDCFLAGS += -DWL11U + DHDCFLAGS += -DBCMCCX + DHDCFLAGS += -DWES_SUPPORT + DHDCFLAGS += -DOKC_SUPPORT + DHDCFLAGS += -DWLTDLS + DHDCFLAGS += -DWLFBT + DHDCFLAGS += -DDHD_ENABLE_LPC + DHDCFLAGS += -DWLAIBSS + DHDCFLAGS += -DSUPPORT_LTECX + DHDCFLAGS += -DSUPPORT_2G_VHT + DHDCFLAGS += -DSUPPORT_WL_TXPOWER + DHDCFLAGS += -DBCMCCX_S69 +ifeq ($(CONFIG_BCM4339),y) + DHDCFLAGS += -DENABLE_INSMOD_NO_FW_LOAD + DHDCFLAGS += -DUSE_LATE_INITCALL_SYNC + DRIVER_TYPE = y +endif +endif + +ifneq ($(CONFIG_BCM4335),) + DHDCFLAGS += -DBCM4335_CHIP -DHW_OOB -DSUPPORT_MULTIPLE_REVISION + DHDCFLAGS += -DUSE_CID_CHECK + DHDCFLAGS += -DENABLE_BCN_LI_BCN_WAKEUP + DHDCFLAGS += -DSDIO_CRC_ERROR_FIX + + # tput enhancement + DHDCFLAGS += -DCUSTOM_GLOM_SETTING=8 -DCUSTOM_RXCHAIN=1 + DHDCFLAGS += -DUSE_DYNAMIC_F2_BLKSIZE -DDYNAMIC_F2_BLKSIZE_FOR_NONLEGACY=128 + DHDCFLAGS += -DBCMSDIOH_TXGLOM -DCUSTOM_TXGLOM=1 -DBCMSDIOH_TXGLOM_HIGHSPEED + DHDCFLAGS += -DDHDTCPACK_SUPPRESS +# DHDCFLAGS += -DDHD_SET_FW_HIGHSPEED + DHDCFLAGS += -DUSE_WL_TXBF + DHDCFLAGS += -DUSE_WL_FRAMEBURST + DHDCFLAGS += -DRXFRAME_THREAD + DHDCFLAGS += -DREPEAT_READFRAME + DHDCFLAGS += -DCUSTOM_AMPDU_BA_WSIZE=64 + DHDCFLAGS += -DCUSTOM_DPC_CPUCORE=0 + DHDCFLAGS += -DPROP_TXSTATUS_VSDB +# DHDCFLAGS += -DTPUT_DEBUG +ifeq ($(CONFIG_MACH_JF),y) + DHDCFLAGS += -DCUSTOM_DEF_TXGLOM_SIZE=32 -DDHD_TXBOUND=32 +endif +ifeq ($(CONFIG_ARCH_MSM),y) + DHDCFLAGS += -DCUSTOM_DEF_TXGLOM_SIZE=32 -DDHD_TXBOUND=32 +endif + DHDCFLAGS += -DCUSTOM_MAX_TXGLOM_SIZE=32 + + # New Features + DHDCFLAGS += -DWL11U + DHDCFLAGS += -DBCMCCX + DHDCFLAGS += -DWES_SUPPORT + DHDCFLAGS += -DOKC_SUPPORT + DHDCFLAGS += -DWLTDLS -DWLTDLS_AUTO_ENABLE + DHDCFLAGS += -DWLFBT + DHDCFLAGS += -DDHD_ENABLE_LPC + DHDCFLAGS += -DWLAIBSS + DHDCFLAGS += -DSUPPORT_LTECX + DHDCFLAGS += -DSUPPORT_2G_VHT + DHDCFLAGS += -DSUPPORT_WL_TXPOWER +# For BT LOCK +ifeq ($(CONFIG_BCM4335BT),y) + DHDCFLAGS += -DENABLE_4335BT_WAR +endif +ifeq ($(CONFIG_BCM4335),y) + DHDCFLAGS += -DENABLE_INSMOD_NO_FW_LOAD + DHDCFLAGS += -DUSE_LATE_INITCALL_SYNC + DRIVER_TYPE = y +endif +endif + +ifneq ($(CONFIG_BCM4334),) + DHDCFLAGS += -DBCM4334_CHIP -DHW_OOB -DSUPPORT_MULTIPLE_REVISION + DHDCFLAGS += -DUSE_CID_CHECK + DHDCFLAGS += -DENABLE_BCN_LI_BCN_WAKEUP + DHDCFLAGS += -DUSE_DYNAMIC_F2_BLKSIZE -DDYNAMIC_F2_BLKSIZE_FOR_NONLEGACY=64 + DHDCFLAGS += -DCUSTOM_GLOM_SETTING=5 + DHDCFLAGS += -DPROP_TXSTATUS_VSDB + DHDCFLAGS += -DWES_SUPPORT + DHDCFLAGS += -DSUPPORT_WL_TXPOWER +ifeq ($(CONFIG_BCM4334),y) + DHDCFLAGS += -DENABLE_INSMOD_NO_FW_LOAD + DHDCFLAGS += -DUSE_LATE_INITCALL_SYNC + DRIVER_TYPE = y +endif +endif + +ifneq ($(CONFIG_BCM4330),) + DHDCFLAGS += -DBCM4330_CHIP -DSUPPORT_MULTIPLE_REVISION + DHDCFLAGS += -DMCAST_LIST_ACCUMULATION + DHDCFLAGS += -DCUSTOM_GLOM_SETTING=0 + DHDCFLAGS += -DWL_CFG80211_GON_COLLISION +ifeq ($(CONFIG_BCM4330),y) + DHDCFLAGS += -DENABLE_INSMOD_NO_FW_LOAD + DHDCFLAGS += -DUSE_LATE_INITCALL_SYNC + DRIVER_TYPE = y +endif + # Remove common feature for BCM4330 + DHDCFLAGS :=$(filter-out -DSUPPORT_AMPDU_MPDU_CMD,$(DHDCFLAGS)) + DHDCFLAGS :=$(filter-out -DVSDB,$(DHDCFLAGS)) + DHDCFLAGS :=$(filter-out -DPROP_TXSTATUS,$(DHDCFLAGS)) + DHDCFLAGS :=$(filter-out -DROAM_AP_ENV_DETECTION,$(DHDCFLAGS)) + DHDCFLAGS :=$(filter-out -DDHD_USE_IDLECOUNT,$(DHDCFLAGS)) +endif + +ifneq ($(CONFIG_BCM43241),) + DHDCFLAGS += -DBCM43241_CHIP -DHW_OOB + DHDCFLAGS += -DMIMO_ANT_SETTING + DHDCFLAGS += -DCUSTOM_GLOM_SETTING=1 -DCUSTOM_SDIO_F2_BLKSIZE=128 + DHDCFLAGS += -DSDIO_CRC_ERROR_FIX + DHDCFLAGS += -DAMPDU_HOSTREORDER +ifeq ($(CONFIG_BCM43241),m) + DHDCFLAGS += -fno-pic +endif +ifeq ($(CONFIG_BCM43241),y) + DHDCFLAGS += -DENABLE_INSMOD_NO_FW_LOAD + DHDCFLAGS += -DUSE_LATE_INITCALL_SYNC + DRIVER_TYPE = y +endif +endif + + +############################# +# Platform dependent feature +############################# + +ifeq ($(CONFIG_SPI_SC8810),y) + DHDCFLAGS += -DREAD_MACADDR -DBCMSPI -DBCMSPI_ANDROID -DSPI_PIO_32BIT_RW -DSPI_PIO_RW_BIGENDIAN + DHDCFLAGS += -UCUSTOM_DPC_PRIO_SETTING + + #Remove defines for SDMMC + DHDCFLAGS :=$(filter-out -DOOB_INTR_ONLY,$(DHDCFLAGS)) + DHDCFLAGS :=$(filter-out -DBCMLXSDMMC,$(DHDCFLAGS)) + + #Remove defines for JB + DHDCFLAGS :=$(filter-out -DWL_ENABLE_P2P_IF,$(DHDCFLAGS)) + DHDCFLAGS :=$(filter-out -DMULTIPLE_SUPPLICANT,$(DHDCFLAGS)) + DHDCFLAGS :=$(filter-out -DWL_CFG80211_STA_EVENT,$(DHDCFLAGS)) +endif + +# For SLP feature +ifeq ($(CONFIG_SLP),y) + DHDCFLAGS += -DUSE_INITIAL_2G_SCAN + DHDCFLAGS += -DPLATFORM_SLP + DHDCFLAGS += -UWL_ENABLE_P2P_IF + DHDCFLAGS += -UMULTIPLE_SUPPLICANT + DHDCFLAGS += -UWL_CFG80211_STA_EVENT +endif + +# GGSM_WIFI_5GHz_CHANNELS feature is define for only GGSM model +ifeq ($(GGSM_WIFI_5GHz_CHANNELS),true) + DHDCFLAGS += -DCUSTOMER_SET_COUNTRY +endif + +############################################################## +# dhd_sec_feature.h +DHDCFLAGS += -include "dhd_sec_feature.h" +############################################################## + +######### +# Others +######### + +#EXTRA_LDFLAGS += --strip-debug + +EXTRA_CFLAGS += $(DHDCFLAGS) -DDHD_DEBUG +EXTRA_CFLAGS += -DSRCBASE=\"$(src)\" +EXTRA_CFLAGS += -I$(src)/include/ -I$(src)/ +KBUILD_CFLAGS += -I$(LINUXDIR)/include -I$(shell pwd) + +DHDOFILES := bcmsdh.o bcmsdh_linux.o bcmsdh_sdmmc.o bcmsdh_sdmmc_linux.o \ + dhd_cdc.o dhd_pno.o dhd_common.o dhd_wlfc.o dhd_ip.o dhd_custom_gpio.o dhd_custom_sec.o \ + dhd_linux.o dhd_linux_sched.o dhd_cfg80211.o dhd_sdio.o aiutils.o bcmevent.o \ + bcmutils.o bcmwifi_channels.o hndpmu.o linux_osl.o sbutils.o siutils.o \ + wl_android.o wl_cfg80211.o wl_cfgp2p.o wldev_common.o wl_linux_mon.o wl_roam.o + +# For SPI projects +ifeq ($(CONFIG_SPI_SC8810),y) +DHDOFILES += bcmsdspi_linux.o bcmspibrcm.o +DHDOFILES :=$(filter-out bcmsdh_sdmmc.o,$(DHDOFILES)) +DHDOFILES :=$(filter-out bcmsdh_sdmmc_linux.o,$(DHDOFILES)) +endif + +dhd-y := $(DHDOFILES) +obj-$(DRIVER_TYPE) += dhd.o + +all: + @echo "$(MAKE) --no-print-directory -C $(KDIR) SUBDIRS=$(CURDIR) modules" + @$(MAKE) --no-print-directory -C $(KDIR) SUBDIRS=$(CURDIR) modules + +clean: + rm -rf *.o *.ko *.mod.c *~ .*.cmd *.o.cmd .*.o.cmd \ + Module.symvers modules.order .tmp_versions modules.builtin + +install: + @$(MAKE) --no-print-directory -C $(KDIR) \ + SUBDIRS=$(CURDIR) modules_install diff --git a/drivers/net/wireless/bcmdhd/aiutils.c b/drivers/net/wireless/bcmdhd/aiutils.c index 16327a5fc0f..ea941516042 100644 --- a/drivers/net/wireless/bcmdhd/aiutils.c +++ b/drivers/net/wireless/bcmdhd/aiutils.c @@ -2,7 +2,7 @@ * Misc utility routines for accessing chip-specific features * of the SiliconBackplane-based Broadcom chips. * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -22,7 +22,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: aiutils.c 363711 2012-10-19 01:36:13Z $ + * $Id: aiutils.c 385510 2013-02-15 21:02:07Z $ */ #include #include @@ -229,16 +229,16 @@ ai_scan(si_t *sih, void *regs, uint devid) (mpd & MPD_MUI_MASK) >> MPD_MUI_SHIFT)); } - + asd = get_asd(sih, &eromptr, 0, 0, AD_ST_SLAVE, &addrl, &addrh, &sizel, &sizeh); if (asd == 0) { do { - - asd = get_asd(sih, &eromptr, 0, 0, AD_ST_BRIDGE, &addrl, &addrh, + + asd = get_asd(sih, &eromptr, 0, 0, AD_ST_BRIDGE, &addrl, &addrh, &sizel, &sizeh); - if (asd != 0) - br = TRUE; - else { + if (asd != 0) + br = TRUE; + else { if (br == TRUE) { break; } @@ -256,7 +256,7 @@ ai_scan(si_t *sih, void *regs, uint devid) } sii->coresba[idx] = addrl; sii->coresba_size[idx] = sizel; - + j = 1; do { asd = get_asd(sih, &eromptr, 0, j, AD_ST_SLAVE, &addrl, &addrh, @@ -545,6 +545,31 @@ ai_flag(si_t *sih) return (R_REG(sii->osh, &ai->oobselouta30) & 0x1f); } +uint +ai_flag_alt(si_t *sih) +{ + si_info_t *sii; + aidmp_t *ai; + + sii = SI_INFO(sih); + if (BCM47162_DMP()) { + SI_ERROR(("%s: Attempting to read MIPS DMP registers on 47162a0", __FUNCTION__)); + return sii->curidx; + } + if (BCM5357_DMP()) { + SI_ERROR(("%s: Attempting to read USB20H DMP registers on 5357b0\n", __FUNCTION__)); + return sii->curidx; + } + if (BCM4707_DMP()) { + SI_ERROR(("%s: Attempting to read CHIPCOMMONB DMP registers on 4707\n", + __FUNCTION__)); + return sii->curidx; + } + ai = sii->curwrap; + + return ((R_REG(sii->osh, &ai->oobselouta30) >> AI_OOBSEL_1_SHIFT) & AI_OOBSEL_MASK); +} + void ai_setint(si_t *sih, int siflag) { diff --git a/drivers/net/wireless/bcmdhd/bcmevent.c b/drivers/net/wireless/bcmdhd/bcmevent.c index e7ed4162acf..5fa789271f7 100644 --- a/drivers/net/wireless/bcmdhd/bcmevent.c +++ b/drivers/net/wireless/bcmdhd/bcmevent.c @@ -1,7 +1,7 @@ /* * bcmevent read-only data shared by kernel or app layers * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -20,7 +20,7 @@ * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. - * $Id: bcmevent.c 374256 2012-12-12 08:34:34Z $ + * $Id: bcmevent.c 440872 2013-12-04 05:25:35Z $ */ #include @@ -29,7 +29,7 @@ #include #include -#if WLC_E_LAST != 108 +#if WLC_E_LAST != 130 #error "You need to add an entry to bcmevent_names[] for the new event" #endif @@ -149,8 +149,21 @@ const bcmevent_name_t bcmevent_names[] = { { WLC_E_PKTDELAY_IND, "PKTDELAY_IND" }, #endif /* WLPKTDLYSTAT */ { WLC_E_SERVICE_FOUND, "SERVICE_FOUND" }, + { WLC_E_GAS_FRAGMENT_RX, "GAS_FRAGMENT_RX" }, + { WLC_E_GAS_COMPLETE, "GAS_COMPLETE" }, { WLC_E_P2PO_ADD_DEVICE, "P2PO_DEV_FOUND" }, - { WLC_E_P2PO_DEL_DEVICE, "P2PO_DEV_FOUND" } + { WLC_E_P2PO_DEL_DEVICE, "P2PO_DEV_LOST" }, +#ifdef WLWNM + { WLC_E_WNM_STA_SLEEP, "WMM_STA_SLEEP" }, +#endif /* WLWNM */ +#if defined(WL_PROXDETECT) + { WLC_E_PROXD, "WLC_E_PROXD" }, +#endif + { WLC_E_CCA_CHAN_QUAL, "CCA_BASED_CHANNEL_QUALITY" }, +#ifdef WLAIBSS + { WLC_E_AIBSS_TXFAIL, "WLC_E_AIBSS_TXFAIL"}, +#endif /* WLAIBSS */ + { WLC_E_CCX_S69_RESP_RX, "CCX_S69_RESPONSE"}, }; const int bcmevent_names_size = ARRAYSIZE(bcmevent_names); diff --git a/drivers/net/wireless/bcmdhd/bcmsdh.c b/drivers/net/wireless/bcmdhd/bcmsdh.c index b65dbdcc980..66be95be2b7 100644 --- a/drivers/net/wireless/bcmdhd/bcmsdh.c +++ b/drivers/net/wireless/bcmdhd/bcmsdh.c @@ -2,7 +2,7 @@ * BCMSDH interface glue * implement bcmsdh API for SDIOH driver * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -22,7 +22,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: bcmsdh.c 369547 2012-11-19 08:57:31Z $ + * $Id: bcmsdh.c 373331 2012-12-07 04:46:22Z $ */ /** @@ -45,10 +45,6 @@ #include /* SDIO Device and Protocol Specs */ -#ifdef CUSTOMER_HW4 -#include -#endif /* CUSTOMER_HW4 */ - #define SDIOH_API_ACCESS_RETRY_LIMIT 2 const uint bcmsdh_msglevel = BCMSDH_ERROR_VAL; @@ -161,9 +157,17 @@ bcmsdh_intr_enable(void *sdh) { bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *)sdh; SDIOH_API_RC status; +#ifdef BCMSPI_ANDROID + uint32 data; +#endif /* BCMSPI_ANDROID */ ASSERT(bcmsdh); status = sdioh_interrupt_set(bcmsdh->sdioh, TRUE); +#ifdef BCMSPI_ANDROID + data = bcmsdh_cfg_read_word(sdh, 0, 4, NULL); + data |= 0xE0E70000; + bcmsdh_cfg_write_word(sdh, 0, 4, data, NULL); +#endif /* BCMSPI_ANDROID */ return (SDIOH_API_SUCCESS(status) ? 0 : BCME_ERROR); } @@ -172,9 +176,17 @@ bcmsdh_intr_disable(void *sdh) { bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *)sdh; SDIOH_API_RC status; +#ifdef BCMSPI_ANDROID + uint32 data; +#endif /* BCMSPI_ANDROID */ ASSERT(bcmsdh); status = sdioh_interrupt_set(bcmsdh->sdioh, FALSE); +#ifdef BCMSPI_ANDROID + data = bcmsdh_cfg_read_word(sdh, 0, 4, NULL); + data &= ~0xE0E70000; + bcmsdh_cfg_write_word(sdh, 0, 4, data, NULL); +#endif /* BCMSPI_ANDROID */ return (SDIOH_API_SUCCESS(status) ? 0 : BCME_ERROR); } @@ -624,7 +636,7 @@ bcmsdh_waitlockfree(void *sdh) } -#ifdef BCMSPI /* 4329 gSPI won't have CIS reads. */ +#ifdef BCMSPI /* 4329 gSPI won't have CIS reads. */ int bcmsdh_query_device(void *sdh) { diff --git a/drivers/net/wireless/bcmdhd/bcmsdh_linux.c b/drivers/net/wireless/bcmdhd/bcmsdh_linux.c index fe19e15278c..2bfb2e46215 100644 --- a/drivers/net/wireless/bcmdhd/bcmsdh_linux.c +++ b/drivers/net/wireless/bcmdhd/bcmsdh_linux.c @@ -1,7 +1,7 @@ /* * SDIO access interface for drivers - linux specific (pci only) * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -21,7 +21,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: bcmsdh_linux.c 384888 2013-02-13 13:25:17Z $ + * $Id: bcmsdh_linux.c 414953 2013-07-26 17:36:27Z $ */ /** @@ -640,7 +640,9 @@ static irqreturn_t wlan_oob_irq(int irq, void *dev_id) dhdp = (dhd_pub_t *)dev_get_drvdata(sdhcinfo->dev); +#ifndef BCMSPI_ANDROID bcmsdh_oob_intr_set(0); +#endif /* !BCMSPI_ANDROID */ if (dhdp == NULL) { SDLX_MSG(("Out of band GPIO interrupt fired way too early\n")); @@ -671,7 +673,13 @@ int bcmsdh_register_oob_intr(void * dhdp) if (error) return -ENODEV; - error = enable_irq_wake(sdhcinfo->oob_irq); +#if defined(CONFIG_ARCH_RHEA) || defined(CONFIG_ARCH_CAPRI) + if (device_may_wakeup(sdhcinfo->dev)) { +#endif + error = enable_irq_wake(sdhcinfo->oob_irq); +#if defined(CONFIG_ARCH_RHEA) || defined(CONFIG_ARCH_CAPRI) + } +#endif if (error) SDLX_MSG(("%s enable_irq_wake error=%d \n", __FUNCTION__, error)); sdhcinfo->oob_irq_registered = TRUE; @@ -688,10 +696,16 @@ void bcmsdh_set_irq(int flag) sdhcinfo->oob_irq_enable_flag = flag; if (flag) { enable_irq(sdhcinfo->oob_irq); - enable_irq_wake(sdhcinfo->oob_irq); +#if defined(CONFIG_ARCH_RHEA) || defined(CONFIG_ARCH_CAPRI) + if (device_may_wakeup(sdhcinfo->dev)) +#endif + enable_irq_wake(sdhcinfo->oob_irq); } else { #if !(defined(BCMSPI_ANDROID) && defined(CUSTOMER_HW4) && defined(CONFIG_NKERNEL)) - disable_irq_wake(sdhcinfo->oob_irq); +#if defined(CONFIG_ARCH_RHEA) || defined(CONFIG_ARCH_CAPRI) + if (device_may_wakeup(sdhcinfo->dev)) +#endif + disable_irq_wake(sdhcinfo->oob_irq); #endif /* !defined(BCMSPI_ANDROID) */ disable_irq(sdhcinfo->oob_irq); } @@ -708,6 +722,14 @@ void bcmsdh_unregister_oob_intr(void) sdhcinfo->oob_irq_registered = FALSE; } } + +bool bcmsdh_is_oob_intr_registered(void) +{ + if (sdhcinfo) + return sdhcinfo->oob_irq_registered; + else + return FALSE; +} #endif /* defined(OOB_INTR_ONLY) || defined(BCMSPI_ANDROID) */ #if defined(BCMLXSDMMC) diff --git a/drivers/net/wireless/bcmdhd/bcmsdh_sdmmc.c b/drivers/net/wireless/bcmdhd/bcmsdh_sdmmc.c index a47dede2b47..68d34c78930 100644 --- a/drivers/net/wireless/bcmdhd/bcmsdh_sdmmc.c +++ b/drivers/net/wireless/bcmdhd/bcmsdh_sdmmc.c @@ -1,7 +1,7 @@ /* * BCMSDH Function Driver for the native SDIO/MMC driver in the Linux Kernel * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -21,7 +21,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: bcmsdh_sdmmc.c 418711 2013-08-16 13:16:57Z $ + * $Id: bcmsdh_sdmmc.c 439169 2013-11-25 23:36:15Z $ */ #include @@ -176,7 +176,6 @@ sdioh_attach(osl_t *osh, void *bar0, uint irq) sd->client_block_size[1] = 64; err_ret = sdio_set_block_size(gInstance->func[1], 64); - /* Release host controller F1 */ sdio_release_host(gInstance->func[1]); if (err_ret) { @@ -184,6 +183,7 @@ sdioh_attach(osl_t *osh, void *bar0, uint irq) MFREE(sd->osh, sd, sizeof(sdioh_info_t)); return NULL; } + } else { sd_err(("%s:gInstance->func[1] is null\n", __FUNCTION__)); MFREE(sd->osh, sd, sizeof(sdioh_info_t)); @@ -196,7 +196,6 @@ sdioh_attach(osl_t *osh, void *bar0, uint irq) sd->client_block_size[2] = sd_f2_blocksize; err_ret = sdio_set_block_size(gInstance->func[2], sd_f2_blocksize); - /* Release host controller F2 */ sdio_release_host(gInstance->func[2]); if (err_ret) { @@ -205,6 +204,7 @@ sdioh_attach(osl_t *osh, void *bar0, uint irq) MFREE(sd->osh, sd, sizeof(sdioh_info_t)); return NULL; } + } else { sd_err(("%s:gInstance->func[2] is null\n", __FUNCTION__)); MFREE(sd->osh, sd, sizeof(sdioh_info_t)); @@ -846,10 +846,6 @@ sdioh_request_byte(sdioh_info_t *sd, uint rw, uint func, uint regaddr, uint8 *by #if defined(MMC_SDIO_ABORT) /* to allow abort command through F1 */ else if (regaddr == SDIOD_CCCR_IOABORT) { - /* Because of SDIO3.0 host issue on Manta, - * sometimes the abort fails. - * Retrying again will fix this issue. - */ while (sdio_abort_retry--) { if (gInstance->func[func]) { sdio_claim_host(gInstance->func[func]); @@ -929,7 +925,6 @@ sdioh_request_word(sdioh_info_t *sd, uint cmd_type, uint rw, uint func, uint add DHD_PM_RESUME_WAIT(sdioh_request_word_wait); DHD_PM_RESUME_RETURN_ERROR(SDIOH_API_RC_FAIL); - /* Claim host controller */ sdio_claim_host(gInstance->func[func]); @@ -1009,7 +1004,6 @@ void sdioh_glom_clear(sdioh_info_t *sd) { void *pnow, *pnext; - uint8 i = 0; pnext = sd->glom_info.glom_pkt_head; @@ -1023,7 +1017,6 @@ sdioh_glom_clear(sdioh_info_t *sd) pnext = PKTNEXT(sd->osh, pnow); PKTSETNEXT(sd->osh, pnow, NULL); sd->glom_info.count--; - i++; } sd->glom_info.glom_pkt_head = NULL; @@ -1204,7 +1197,7 @@ sdioh_request_packet(sdioh_info_t *sd, uint fix_inc, uint write, uint func, for (pnext = pkt; pnext; pnext = PKTNEXT(sd->osh, pnext)) { uint8 *buf = (uint8*)PKTDATA(sd->osh, pnext) + xfred_len; - uint pad = 0; + int pad = 0; pkt_len = PKTLEN(sd->osh, pnext); if (0 != xfred_len) { pkt_len -= xfred_len; @@ -1251,11 +1244,11 @@ sdioh_request_packet(sdioh_info_t *sd, uint fix_inc, uint write, uint func, !need_txglom && #endif TRUE) { - pkt_len = sdioh_request_packet_align(pkt_len, write, + int align_pkt_len = 0; + align_pkt_len = sdioh_request_packet_align(pkt_len, write, func, blk_size); - pad = pkt_len - PKTLEN(sd->osh, pnext); - + pad = align_pkt_len - pkt_len; if (pad > 0) { if (func == SDIO_FUNC_2) { sd_err(("%s: padding is unexpected! pkt_len %d," @@ -1275,6 +1268,7 @@ sdioh_request_packet(sdioh_info_t *sd, uint fix_inc, uint write, uint func, return SDIOH_API_RC_FAIL; } } + pkt_len += pad; } } @@ -1335,87 +1329,51 @@ sdioh_request_packet(sdioh_info_t *sd, uint fix_inc, uint write, uint func, */ extern SDIOH_API_RC sdioh_request_buffer(sdioh_info_t *sd, uint pio_dma, uint fix_inc, uint write, uint func, - uint addr, uint reg_width, uint buflen_u, uint8 *buffer, void *pkt) + uint addr, uint reg_width, uint buflen_u, uint8 *buffer, void *pkt) { SDIOH_API_RC Status; - void *mypkt = NULL; + void *tmppkt; + void *orig_buf = NULL; + uint copylen = 0; sd_trace(("%s: Enter\n", __FUNCTION__)); DHD_PM_RESUME_WAIT(sdioh_request_buffer_wait); DHD_PM_RESUME_RETURN_ERROR(SDIOH_API_RC_FAIL); - /* Case 1: we don't have a packet. */ - if (pkt == NULL) { - sd_data(("%s: Creating new %s Packet, len=%d\n", - __FUNCTION__, write ? "TX" : "RX", buflen_u)); -#ifdef CONFIG_DHD_USE_STATIC_BUF - if (!(mypkt = PKTGET_STATIC(sd->osh, buflen_u, write ? TRUE : FALSE))) { -#else - if (!(mypkt = PKTGET(sd->osh, buflen_u, write ? TRUE : FALSE))) { -#endif /* CONFIG_DHD_USE_STATIC_BUF */ - sd_err(("%s: PKTGET failed: len %d\n", - __FUNCTION__, buflen_u)); - return SDIOH_API_RC_FAIL; - } - /* For a write, copy the buffer data into the packet. */ - if (write) { - bcopy(buffer, PKTDATA(sd->osh, mypkt), buflen_u); - } - - Status = sdioh_request_packet(sd, fix_inc, write, func, addr, mypkt); - - /* For a read, copy the packet data back to the buffer. */ - if (!write) { - bcopy(PKTDATA(sd->osh, mypkt), buffer, buflen_u); - } -#ifdef CONFIG_DHD_USE_STATIC_BUF - PKTFREE_STATIC(sd->osh, mypkt, write ? TRUE : FALSE); -#else - PKTFREE(sd->osh, mypkt, write ? TRUE : FALSE); -#endif /* CONFIG_DHD_USE_STATIC_BUF */ - } else if (((ulong)(PKTDATA(sd->osh, pkt)) & DMA_ALIGN_MASK) != 0) { - /* Case 2: We have a packet, but it is unaligned. */ - - /* In this case, we cannot have a chain. */ + if (pkt == NULL) { + /* Case 1: we don't have a packet. */ + orig_buf = buffer; + copylen = buflen_u; + } else if ((ulong)PKTDATA(sd->osh, pkt) & DMA_ALIGN_MASK) { + /* Case 2: We have a packet, but it is unaligned. + * in this case, we cannot have a chain. + */ ASSERT(PKTNEXT(sd->osh, pkt) == NULL); - sd_data(("%s: Creating aligned %s Packet, len=%d\n", - __FUNCTION__, write ? "TX" : "RX", PKTLEN(sd->osh, pkt))); -#ifdef CONFIG_DHD_USE_STATIC_BUF - if (!(mypkt = PKTGET_STATIC(sd->osh, PKTLEN(sd->osh, pkt), write ? TRUE : FALSE))) { -#else - if (!(mypkt = PKTGET(sd->osh, PKTLEN(sd->osh, pkt), write ? TRUE : FALSE))) { -#endif /* CONFIG_DHD_USE_STATIC_BUF */ - sd_err(("%s: PKTGET failed: len %d\n", - __FUNCTION__, PKTLEN(sd->osh, pkt))); + orig_buf = PKTDATA(sd->osh, pkt); + copylen = PKTLEN(sd->osh, pkt); + } + + tmppkt = pkt; + if (copylen) { + tmppkt = PKTGET_STATIC(sd->osh, copylen, write ? TRUE : FALSE); + if (tmppkt == NULL) { + sd_err(("%s: PKTGET failed: len %d\n", __FUNCTION__, copylen)); return SDIOH_API_RC_FAIL; } - /* For a write, copy the buffer data into the packet. */ - if (write) { - bcopy(PKTDATA(sd->osh, pkt), - PKTDATA(sd->osh, mypkt), - PKTLEN(sd->osh, pkt)); - } + if (write) + bcopy(orig_buf, PKTDATA(sd->osh, tmppkt), copylen); + } - Status = sdioh_request_packet(sd, fix_inc, write, func, addr, mypkt); + Status = sdioh_request_packet(sd, fix_inc, write, func, addr, tmppkt); + if (copylen) { /* For a read, copy the packet data back to the buffer. */ - if (!write) { - bcopy(PKTDATA(sd->osh, mypkt), - PKTDATA(sd->osh, pkt), - PKTLEN(sd->osh, mypkt)); - } -#ifdef CONFIG_DHD_USE_STATIC_BUF - PKTFREE_STATIC(sd->osh, mypkt, write ? TRUE : FALSE); -#else - PKTFREE(sd->osh, mypkt, write ? TRUE : FALSE); -#endif /* CONFIG_DHD_USE_STATIC_BUF */ - } else { /* case 3: We have a packet and it is aligned. */ - sd_data(("%s: Aligned %s Packet, direct DMA\n", - __FUNCTION__, write ? "Tx" : "Rx")); - Status = sdioh_request_packet(sd, fix_inc, write, func, addr, pkt); + if (!write) + bcopy(PKTDATA(sd->osh, tmppkt), orig_buf, PKTLEN(sd->osh, tmppkt)); + PKTFREE_STATIC(sd->osh, tmppkt, write ? TRUE : FALSE); } return (Status); diff --git a/drivers/net/wireless/bcmdhd/bcmsdh_sdmmc_linux.c b/drivers/net/wireless/bcmdhd/bcmsdh_sdmmc_linux.c index db1960cb479..523837544a5 100644 --- a/drivers/net/wireless/bcmdhd/bcmsdh_sdmmc_linux.c +++ b/drivers/net/wireless/bcmdhd/bcmsdh_sdmmc_linux.c @@ -1,7 +1,7 @@ /* * BCMSDH Function Driver for the native SDIO/MMC driver in the Linux Kernel * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -21,7 +21,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: bcmsdh_sdmmc_linux.c 423535 2013-09-12 12:06:48Z $ + * $Id: bcmsdh_sdmmc_linux.c 425711 2013-09-25 06:40:41Z $ */ #include @@ -110,6 +110,9 @@ static int bcmsdh_sdmmc_probe(struct sdio_func *func, int ret = 0; static struct sdio_func sdio_func_0; + if (!gInstance) + return -EINVAL; + if (func) { sd_trace(("bcmsdh_sdmmc: %s Enter\n", __FUNCTION__)); sd_trace(("sdio_bcmsdh: func->class=%x\n", func->class)); @@ -136,7 +139,7 @@ static int bcmsdh_sdmmc_probe(struct sdio_func *func, #endif sd_trace(("F2 found, calling bcmsdh_probe...\n")); ret = bcmsdh_probe(&func->dev); - if (ret < 0 && gInstance) + if (ret < 0) gInstance->func[2] = NULL; } } else { @@ -411,7 +414,7 @@ int sdio_function_init(void) return -ENOMEM; error = sdio_register_driver(&bcmsdh_sdmmc_driver); - if (error && gInstance) { + if (error) { kfree(gInstance); gInstance = NULL; } diff --git a/drivers/net/wireless/bcmdhd/bcmsdspi_linux.c b/drivers/net/wireless/bcmdhd/bcmsdspi_linux.c index 4e699708405..3d74edc5a27 100644 --- a/drivers/net/wireless/bcmdhd/bcmsdspi_linux.c +++ b/drivers/net/wireless/bcmdhd/bcmsdspi_linux.c @@ -1,14 +1,14 @@ /* * Broadcom SPI Host Controller Driver - Linux Per-port * - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2013, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -16,12 +16,12 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: bcmsdspi_linux.c 356773 2012-09-13 22:50:30Z $ + * $Id: bcmsdspi_linux.c 373331 2012-12-07 04:46:22Z $ */ #include @@ -30,27 +30,36 @@ #include /* bcmsdh to/from specific controller APIs */ #include /* to get msglevel bit values */ -#ifndef BCMSPI_ANDROID +#ifdef BCMSPI_ANDROID +#include +#include +#include +#else #include #include /* SDIO Device and Protocol Specs */ #include /* request_irq(), free_irq() */ - #include #include +#endif /* BCMSPI_ANDROID */ +#ifndef BCMSPI_ANDROID extern uint sd_crc; module_param(sd_crc, uint, 0); #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0)) #define KERNEL26 #endif +#endif /* !BCMSPI_ANDROID */ struct sdos_info { sdioh_info_t *sd; spinlock_t lock; +#ifndef BCMSPI_ANDROID wait_queue_head_t intr_wait_queue; +#endif /* !BCMSPI_ANDROID */ }; +#ifndef BCMSPI_ANDROID #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0)) #define BLOCKABLE() (!in_atomic()) #else @@ -87,10 +96,9 @@ sdspi_isr(int irq, void *dev_id return IRQ_RETVAL(ours); } } -#else /* !BCMSPI_ANDROID */ -#include -#include +#endif /* !BCMSPI_ANDROID */ +#ifdef BCMSPI_ANDROID static struct spi_device *gBCMSPI = NULL; extern int bcmsdh_probe(struct device *dev); @@ -160,7 +168,7 @@ void spi_function_cleanup(void) sd_trace(("%s Enter\n", __FUNCTION__)); spi_unregister_driver(&bcmsdh_spi_driver); } -#endif /* !BCMSPI_ANDROID */ +#endif /* BCMSPI_ANDROID */ /* Register with Linux for interrupts */ int @@ -203,7 +211,6 @@ spi_reg_unmap(osl_t *osh, uintptr addr, int size) int spi_osinit(sdioh_info_t *sd) { -#ifndef BCMSPI_ANDROID struct sdos_info *sdos; sdos = (struct sdos_info*)MALLOC(sd->osh, sizeof(struct sdos_info)); @@ -213,6 +220,7 @@ spi_osinit(sdioh_info_t *sd) sdos->sd = sd; spin_lock_init(&sdos->lock); +#ifndef BCMSPI_ANDROID init_waitqueue_head(&sdos->intr_wait_queue); #endif /* !BCMSPI_ANDROID */ return BCME_OK; @@ -221,20 +229,17 @@ spi_osinit(sdioh_info_t *sd) void spi_osfree(sdioh_info_t *sd) { -#ifndef BCMSPI_ANDROID struct sdos_info *sdos; ASSERT(sd && sd->sdos_info); sdos = (struct sdos_info *)sd->sdos_info; MFREE(sd->osh, sdos, sizeof(struct sdos_info)); -#endif /* !BCMSPI_ANDROID */ } /* Interrupt enable/disable */ SDIOH_API_RC sdioh_interrupt_set(sdioh_info_t *sd, bool enable) { -#ifndef BCMSPI_ANDROID ulong flags; struct sdos_info *sdos; @@ -248,22 +253,25 @@ sdioh_interrupt_set(sdioh_info_t *sd, bool enable) return SDIOH_API_RC_FAIL; } +#ifndef BCMSPI_ANDROID if (enable && !(sd->intr_handler && sd->intr_handler_arg)) { sd_err(("%s: no handler registered, will not enable\n", __FUNCTION__)); return SDIOH_API_RC_FAIL; } +#endif /* !BCMSPI_ANDROID */ /* Ensure atomicity for enable/disable calls */ spin_lock_irqsave(&sdos->lock, flags); sd->client_intr_enabled = enable; +#ifndef BCMSPI_ANDROID if (enable && !sd->lockcount) spi_devintr_on(sd); else spi_devintr_off(sd); +#endif /* !BCMSPI_ANDROID */ spin_unlock_irqrestore(&sdos->lock, flags); -#endif /* !BCMSPI_ANDROID */ return SDIOH_API_RC_SUCCESS; } @@ -272,7 +280,6 @@ sdioh_interrupt_set(sdioh_info_t *sd, bool enable) void spi_lock(sdioh_info_t *sd) { -#ifndef BCMSPI_ANDROID ulong flags; struct sdos_info *sdos; @@ -286,17 +293,20 @@ spi_lock(sdioh_info_t *sd) sd_err(("%s: Already locked!\n", __FUNCTION__)); ASSERT(sd->lockcount == 0); } +#ifdef BCMSPI_ANDROID + if (sd->client_intr_enabled) + bcmsdh_oob_intr_set(0); +#else spi_devintr_off(sd); +#endif /* BCMSPI_ANDROID */ sd->lockcount++; spin_unlock_irqrestore(&sdos->lock, flags); -#endif /* !BCMSPI_ANDROID */ } /* Enable client interrupt */ void spi_unlock(sdioh_info_t *sd) { -#ifndef BCMSPI_ANDROID ulong flags; struct sdos_info *sdos; @@ -308,10 +318,13 @@ spi_unlock(sdioh_info_t *sd) spin_lock_irqsave(&sdos->lock, flags); if (--sd->lockcount == 0 && sd->client_intr_enabled) { +#ifdef BCMSPI_ANDROID + bcmsdh_oob_intr_set(1); +#else spi_devintr_on(sd); +#endif /* BCMSPI_ANDROID */ } spin_unlock_irqrestore(&sdos->lock, flags); -#endif /* !BCMSPI_ANDROID */ } #ifndef BCMSPI_ANDROID diff --git a/drivers/net/wireless/bcmdhd/bcmspibrcm.c b/drivers/net/wireless/bcmdhd/bcmspibrcm.c index 95b667370ea..6de84f3a46b 100644 --- a/drivers/net/wireless/bcmdhd/bcmspibrcm.c +++ b/drivers/net/wireless/bcmdhd/bcmspibrcm.c @@ -1,14 +1,14 @@ /* * Broadcom BCMSDH to gSPI Protocol Conversion Layer * - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2013, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -16,12 +16,12 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: bcmspibrcm.c 359460 2012-09-28 01:51:23Z $ + * $Id: bcmspibrcm.c 373331 2012-12-07 04:46:22Z $ */ #define HSMODE @@ -72,7 +72,7 @@ extern void spi_sendrecv(sdioh_info_t *sd, uint8 *msg_out, uint8 *msg_in, int ms uint sd_msglevel = SDH_ERROR_VAL; #else uint sd_msglevel = 0; -#endif +#endif uint sd_hiok = FALSE; /* Use hi-speed mode if available? */ uint sd_sdmode = SDIOH_MODE_SPI; /* Use SD4 mode by default */ @@ -94,6 +94,9 @@ uint8 spi_inbuf[SPI_MAX_PKT_LEN]; #define BUF2_PKT_LEN 128 uint8 spi_outbuf2[BUF2_PKT_LEN]; uint8 spi_inbuf2[BUF2_PKT_LEN]; +#ifdef BCMSPI_ANDROID +uint *dhd_spi_lockcount = NULL; +#endif /* BCMSPI_ANDROID */ #if !(defined(SPI_PIO_RW_BIGENDIAN) && defined(SPI_PIO_32BIT_RW)) #define SPISWAP_WD4(x) bcmswap32(x); @@ -164,6 +167,10 @@ sdioh_attach(osl_t *osh, void *bar0, uint irq) */ sd->wordlen = 2; +#ifdef BCMSPI_ANDROID + dhd_spi_lockcount = &sd->lockcount; +#endif /* BCMSPI_ANDROID */ + #ifndef BCMSPI_ANDROID if (!spi_hw_attach(sd)) { sd_err(("%s: spi_hw_attach() failed\n", __FUNCTION__)); @@ -209,6 +216,9 @@ sdioh_detach(osl_t *osh, sdioh_info_t *sd) spi_hw_detach(sd); #endif /* !BCMSPI_ANDROID */ spi_osfree(sd); +#ifdef BCMSPI_ANDROID + dhd_spi_lockcount = NULL; +#endif /* !BCMSPI_ANDROID */ MFREE(sd->osh, sd, sizeof(sdioh_info_t)); } return SDIOH_API_RC_SUCCESS; @@ -218,24 +228,24 @@ sdioh_detach(osl_t *osh, sdioh_info_t *sd) extern SDIOH_API_RC sdioh_interrupt_register(sdioh_info_t *sd, sdioh_cb_fn_t fn, void *argh) { -#ifndef BCMSPI_ANDROID sd_trace(("%s: Entering\n", __FUNCTION__)); +#if !defined(OOB_INTR_ONLY) sd->intr_handler = fn; sd->intr_handler_arg = argh; sd->intr_handler_valid = TRUE; -#endif /* !BCMSPI_ANDROID */ +#endif /* !defined(OOB_INTR_ONLY) */ return SDIOH_API_RC_SUCCESS; } extern SDIOH_API_RC sdioh_interrupt_deregister(sdioh_info_t *sd) { -#ifndef BCMSPI_ANDROID sd_trace(("%s: Entering\n", __FUNCTION__)); +#if !defined(OOB_INTR_ONLY) sd->intr_handler_valid = FALSE; sd->intr_handler = NULL; sd->intr_handler_arg = NULL; -#endif /* !BCMSPI_ANDROID */ +#endif /* !defined(OOB_INTR_ONLY) */ return SDIOH_API_RC_SUCCESS; } @@ -336,7 +346,7 @@ enum { }; const bcm_iovar_t sdioh_iovars[] = { - {"sd_msglevel", IOV_MSGLEVEL, 0, IOVT_UINT32, 0 }, + {"sd_msglevel", IOV_MSGLEVEL, 0, IOVT_UINT32, 0 }, {"sd_blocksize", IOV_BLOCKSIZE, 0, IOVT_UINT32, 0 }, /* ((fn << 16) | size) */ {"sd_dma", IOV_DMA, 0, IOVT_BOOL, 0 }, {"sd_ints", IOV_USEINTS, 0, IOVT_BOOL, 0 }, diff --git a/drivers/net/wireless/bcmdhd/bcmutils.c b/drivers/net/wireless/bcmdhd/bcmutils.c index 6f473fea054..d1260fdcf77 100644 --- a/drivers/net/wireless/bcmdhd/bcmutils.c +++ b/drivers/net/wireless/bcmdhd/bcmutils.c @@ -1,7 +1,7 @@ /* * Driver O/S-independent utility routines * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -20,7 +20,7 @@ * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. - * $Id: bcmutils.c 412798 2013-07-16 15:59:30Z $ + * $Id: bcmutils.c 440953 2013-12-04 13:39:58Z $ */ #include @@ -1025,6 +1025,21 @@ bcm_ether_atoe(const char *p, struct ether_addr *ea) return (i == 6); } + +int +bcm_atoipv4(const char *p, struct ipv4_addr *ip) +{ + + int i = 0; + char *c; + for (;;) { + ip->addr[i++] = (uint8)bcm_strtoul(p, &c, 0); + if (*c++ != '.' || i == IPV4_ADDR_LEN) + break; + p = c; + } + return (i == IPV4_ADDR_LEN); +} #endif /* !BCMROMOFFLOAD_EXCLUDE_BCMUTILS_FUNCS */ @@ -2119,6 +2134,39 @@ bcm_print_bytes(const char *name, const uchar *data, int len) } printf("\n"); } + +/* Look for vendor-specific IE with specified OUI and optional type */ +bcm_tlv_t * +find_vendor_ie(void *tlvs, int tlvs_len, const char *voui, uint8 *type, int type_len) +{ + bcm_tlv_t *ie; + uint8 ie_len; + + ie = (bcm_tlv_t*)tlvs; + + /* make sure we are looking at a valid IE */ + if (ie == NULL || + !bcm_valid_tlv(ie, tlvs_len)) + return NULL; + + /* Walk through the IEs looking for an OUI match */ + do { + ie_len = ie->len; + if ((ie->id == DOT11_MNG_PROPR_ID) && + (ie_len >= (DOT11_OUI_LEN + type_len)) && + !bcmp(ie->data, voui, DOT11_OUI_LEN)) + { + /* compare optional type */ + if (type_len == 0 || + !bcmp(&ie->data[DOT11_OUI_LEN], type, type_len)) { + return (ie); /* a match */ + } + } + } while ((ie = bcm_next_tlv(ie, &tlvs_len)) != NULL); + + return NULL; +} + #if defined(WLTINYDUMP) || defined(WLMSG_INFORM) || defined(WLMSG_ASSOC) || \ defined(WLMSG_PRPKT) || defined(WLMSG_WSEC) #define SSID_FMT_BUF_LEN ((4 * DOT11_MAX_SSID_LEN) + 1) @@ -2206,3 +2254,93 @@ process_nvram_vars(char *varbuf, unsigned int len) return buf_len; } + +/* calculate a * b + c */ +void +bcm_uint64_multiple_add(uint32* r_high, uint32* r_low, uint32 a, uint32 b, uint32 c) +{ +#define FORMALIZE(var) {cc += (var & 0x80000000) ? 1 : 0; var &= 0x7fffffff;} + uint32 r1, r0; + uint32 a1, a0, b1, b0, t, cc = 0; + + a1 = a >> 16; + a0 = a & 0xffff; + b1 = b >> 16; + b0 = b & 0xffff; + + r0 = a0 * b0; + FORMALIZE(r0); + + t = (a1 * b0) << 16; + FORMALIZE(t); + + r0 += t; + FORMALIZE(r0); + + t = (a0 * b1) << 16; + FORMALIZE(t); + + r0 += t; + FORMALIZE(r0); + + FORMALIZE(c); + + r0 += c; + FORMALIZE(r0); + + r0 |= (cc % 2) ? 0x80000000 : 0; + r1 = a1 * b1 + ((a1 * b0) >> 16) + ((b1 * a0) >> 16) + (cc / 2); + + *r_high = r1; + *r_low = r0; +} + +/* calculate a / b */ +void +bcm_uint64_divide(uint32* r, uint32 a_high, uint32 a_low, uint32 b) +{ + uint32 a1 = a_high, a0 = a_low, r0 = 0; + + if (b < 2) + return; + + while (a1 != 0) { + r0 += (0xffffffff / b) * a1; + bcm_uint64_multiple_add(&a1, &a0, ((0xffffffff % b) + 1) % b, a1, a0); + } + + r0 += a0 / b; + *r = r0; +} + +#ifndef setbit /* As in the header file */ +#ifdef BCMUTILS_BIT_MACROS_USE_FUNCS +/* Set bit in byte array. */ +void +setbit(void *array, uint bit) +{ + ((uint8 *)array)[bit / NBBY] |= 1 << (bit % NBBY); +} + +/* Clear bit in byte array. */ +void +clrbit(void *array, uint bit) +{ + ((uint8 *)array)[bit / NBBY] &= ~(1 << (bit % NBBY)); +} + +/* Test if bit is set in byte array. */ +bool +isset(const void *array, uint bit) +{ + return (((const uint8 *)array)[bit / NBBY] & (1 << (bit % NBBY))); +} + +/* Test if bit is clear in byte array. */ +bool +isclr(const void *array, uint bit) +{ + return ((((const uint8 *)array)[bit / NBBY] & (1 << (bit % NBBY))) == 0); +} +#endif /* BCMUTILS_BIT_MACROS_USE_FUNCS */ +#endif /* setbit */ diff --git a/drivers/net/wireless/bcmdhd/bcmwifi_channels.c b/drivers/net/wireless/bcmdhd/bcmwifi_channels.c index 45bde7c0f6f..97c1b6f764e 100644 --- a/drivers/net/wireless/bcmdhd/bcmwifi_channels.c +++ b/drivers/net/wireless/bcmdhd/bcmwifi_channels.c @@ -3,7 +3,7 @@ * Contents are wifi-specific, used by any kernel or app-level * software that might want wifi things as it grows. * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -27,10 +27,10 @@ #include #include +#include #ifdef BCMDRIVER #include -#include #define strtoul(nptr, endptr, base) bcm_strtoul((nptr), (endptr), (base)) #define tolower(c) (bcm_isupper((c)) ? ((c) + 'a' - 'A') : (c)) #else @@ -763,6 +763,9 @@ wf_chspec_valid(chanspec_t chanspec) if (i == num_ch) { + if (chspec_ch == 165) + i = 0; + if (chspec_ch == 34 || chspec_ch == 38 || chspec_ch == 42 || chspec_ch == 46) i = 0; @@ -884,7 +887,7 @@ wf_channel2chspec(uint ctl_ch, uint bw) } } - + if (sb < 0) { return 0; } @@ -984,3 +987,99 @@ wf_channel2mhz(uint ch, uint start_factor) return freq; } + + +static const struct chan_info { + uint16 chan; + uint16 freq; +} chan_info[] = { + + {1, 2412}, + {2, 2417}, + {3, 2422}, + {4, 2427}, + {5, 2432}, + {6, 2437}, + {7, 2442}, + {8, 2447}, + {9, 2452}, + {10, 2457}, + {11, 2462}, + {12, 2467}, + {13, 2472}, + {14, 2484}, + +#ifdef BAND5G + + {34, 5170}, + {38, 5190}, + {42, 5210}, + {46, 5230}, + + + {36, 5180}, + {40, 5200}, + {44, 5220}, + {48, 5240}, + {52, 5260}, + {56, 5280}, + {60, 5300}, + {64, 5320}, + + + {100, 5500}, + {104, 5520}, + {108, 5540}, + {112, 5560}, + {116, 5580}, + {120, 5600}, + {124, 5620}, + {128, 5640}, + {132, 5660}, + {136, 5680}, + {140, 5700}, + + + {149, 5745}, + {153, 5765}, + {157, 5785}, + {161, 5805}, + {165, 5825}, + + + {184, 4920}, + {188, 4940}, + {192, 4960}, + {196, 4980}, + {200, 5000}, + {204, 5020}, + {208, 5040}, + {212, 5060}, + {216, 5080} +#endif +}; + + +uint +wf_freq2channel(uint freq) +{ + uint i; + + for (i = 0; i < ARRAYSIZE(chan_info); i++) { + if (chan_info[i].freq == freq) + return (chan_info[i].chan); + } + return (0); +} + + +uint +wf_channel2freq(uint channel) +{ + uint i; + + for (i = 0; i < ARRAYSIZE(chan_info); i++) + if (chan_info[i].chan == channel) + return (chan_info[i].freq); + return (0); +} diff --git a/drivers/net/wireless/bcmdhd/bcmwifi_channels.h b/drivers/net/wireless/bcmdhd/bcmwifi_channels.h index 91c76000972..eeb09203297 100644 --- a/drivers/net/wireless/bcmdhd/bcmwifi_channels.h +++ b/drivers/net/wireless/bcmdhd/bcmwifi_channels.h @@ -3,7 +3,7 @@ * This header file housing the define and function prototype use by * both the wl driver, tools & Apps. * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -86,7 +86,7 @@ typedef uint16 chanspec_t; ((channel) + CH_10MHZ_APART) : 0) #define LL_20_SB(channel) (((channel) > 3 * CH_10MHZ_APART) ? ((channel) - 3 * CH_10MHZ_APART) : 0) -#define UU_20_SB(channel) (((channel) < (MAXCHANNEL - 3 * CH_10MHZ_APART)) ? \ +#define UU_20_SB(channel) (((channel) < (MAXCHANNEL - 3 * CH_10MHZ_APART)) ? \ ((channel) + 3 * CH_10MHZ_APART) : 0) #define LU_20_SB(channel) LOWER_20_SB(channel) #define UL_20_SB(channel) UPPER_20_SB(channel) @@ -191,7 +191,7 @@ typedef uint16 chanspec_t; ((channel) + CH_10MHZ_APART) : 0) #define LL_20_SB(channel) (((channel) > 3 * CH_10MHZ_APART) ? ((channel) - 3 * CH_10MHZ_APART) : 0) -#define UU_20_SB(channel) (((channel) < (MAXCHANNEL - 3 * CH_10MHZ_APART)) ? \ +#define UU_20_SB(channel) (((channel) < (MAXCHANNEL - 3 * CH_10MHZ_APART)) ? \ ((channel) + 3 * CH_10MHZ_APART) : 0) #define LU_20_SB(channel) LOWER_20_SB(channel) #define UL_20_SB(channel) UPPER_20_SB(channel) @@ -356,4 +356,8 @@ extern int wf_channel2mhz(uint channel, uint start_factor); extern uint16 wf_channel2chspec(uint ctl_ch, uint bw); +extern uint wf_channel2freq(uint channel); +extern uint wf_freq2channel(uint freq); + + #endif diff --git a/drivers/net/wireless/bcmdhd/bcmwifi_rates.h b/drivers/net/wireless/bcmdhd/bcmwifi_rates.h index 57e082a06ca..42b9b9e211a 100644 --- a/drivers/net/wireless/bcmdhd/bcmwifi_rates.h +++ b/drivers/net/wireless/bcmdhd/bcmwifi_rates.h @@ -1,7 +1,7 @@ /* * Indices for 802.11 a/b/g/n/ac 1-3 chain symmetric transmit rates * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -48,8 +48,7 @@ typedef enum wl_tx_bw { WL_TX_BW_80, WL_TX_BW_20IN40, WL_TX_BW_20IN80, - WL_TX_BW_40IN80, - WL_TX_BW_ALL + WL_TX_BW_40IN80 } wl_tx_bw_t; @@ -296,9 +295,9 @@ typedef enum clm_rates { WL_RATE_3X3_VHT9SS3 = 115, + - - + WL_RATE_1X2_TXBF_OFDM_6 = 116, WL_RATE_1X2_TXBF_OFDM_9 = 117, @@ -329,7 +328,7 @@ typedef enum clm_rates { WL_RATE_1X2_TXBF_VHT8SS1 = 132, WL_RATE_1X2_TXBF_VHT9SS1 = 133, - + WL_RATE_2X2_TXBF_SDM_MCS8 = 134, WL_RATE_2X2_TXBF_SDM_MCS9 = 135, @@ -352,7 +351,7 @@ typedef enum clm_rates { - + WL_RATE_1X3_TXBF_OFDM_6 = 142, WL_RATE_1X3_TXBF_OFDM_9 = 143, @@ -383,7 +382,7 @@ typedef enum clm_rates { WL_RATE_1X3_TXBF_VHT8SS1 = 158, WL_RATE_1X3_TXBF_VHT9SS1 = 159, - + WL_RATE_2X3_TXBF_SDM_MCS8 = 160, WL_RATE_2X3_TXBF_SDM_MCS9 = 161, @@ -405,7 +404,7 @@ typedef enum clm_rates { WL_RATE_2X3_TXBF_VHT8SS2 = 168, WL_RATE_2X3_TXBF_VHT9SS2 = 169, - + WL_RATE_3X3_TXBF_SDM_MCS16 = 170, WL_RATE_3X3_TXBF_SDM_MCS17 = 171, diff --git a/drivers/net/wireless/bcmdhd/dhd.h b/drivers/net/wireless/bcmdhd/dhd.h index 2669b27623d..3e93522a222 100644 --- a/drivers/net/wireless/bcmdhd/dhd.h +++ b/drivers/net/wireless/bcmdhd/dhd.h @@ -4,7 +4,7 @@ * Provides type definitions and function prototypes used to link the * DHD OS, bus, and protocol modules. * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -24,7 +24,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: dhd.h 418908 2013-08-18 02:24:33Z $ + * $Id: dhd.h 444875 2013-12-22 07:29:44Z $ */ /**************** @@ -43,6 +43,7 @@ #include #include #include +#include #include #include #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) && defined(CONFIG_HAS_WAKELOCK) @@ -58,16 +59,22 @@ int setScheduler(struct task_struct *p, int policy, struct sched_param *param); #include #include -#ifdef CUSTOMER_HW4 -#include -#endif /* CUSTOMER_HW4 */ - +#if defined(NDISVER) && (NDISVER >= 0x0600) +#include +#include +#endif /* (NDISVER >= 0x0600) */ +#if defined(KEEP_ALIVE) +/* Default KEEP_ALIVE Period is 55 sec to prevent AP from sending Keep Alive probe frame */ +#define KEEP_ALIVE_PERIOD 55000 +#define NULL_PKT_STR "null_pkt" +#endif /* KEEP_ALIVE */ /* Forward decls */ struct dhd_bus; struct dhd_prot; struct dhd_info; struct dhd_ioctl; +struct dhd_cmn; /* The level of bus communication with the dongle */ enum dhd_bus_state { @@ -76,6 +83,17 @@ enum dhd_bus_state { DHD_BUS_DATA /* Ready for frame transfers */ }; +#if defined(NDISVER) && (NDISVER >= 0x0600) +/* Firmware requested operation mode */ +#define STA_MASK 0x0001 +#define HOSTAPD_MASK 0x0002 +#define WFD_MASK 0x0004 +#define SOFTAP_FW_MASK 0x0008 +#define P2P_GO_ENABLED 0x0010 +#define P2P_GC_ENABLED 0x0020 +#define CONCURENT_MASK 0x00F0 +#endif /* (NDISVER >= 0x0600) */ + enum dhd_op_flags { /* Firmware requested operation mode */ DHD_FLAG_STA_MODE = (1 << (0)), /* STA only */ @@ -112,6 +130,11 @@ enum dhd_op_flags { #define POWERUP_WAIT_MS 2000 /* ms: time out in waiting wifi to come up */ #endif +#define DEFAULT_WIFI_TURNON_DELAY 250 +#ifndef WIFI_TURNON_DELAY +#define WIFI_TURNON_DELAY DEFAULT_WIFI_TURNON_DELAY +#endif /* WIFI_TURNON_DELAY */ + enum dhd_bus_wake_state { WAKE_LOCK_OFF, WAKE_LOCK_PRIV, @@ -125,8 +148,7 @@ enum dhd_bus_wake_state { WAKE_LOCK_SOFTAP_SET, WAKE_LOCK_SOFTAP_STOP, WAKE_LOCK_SOFTAP_START, - WAKE_LOCK_SOFTAP_THREAD, - WAKE_LOCK_MAX + WAKE_LOCK_SOFTAP_THREAD }; enum dhd_prealloc_index { @@ -152,6 +174,13 @@ typedef enum { } dhd_if_state_t; +typedef enum { + DHD_IPV6_ADDR_NONE = 0, + DHD_IPV6_ADDR_ADD, + DHD_IPV6_ADDR_DELETE +} dhd_ipv6_op_t; + + #if defined(CONFIG_DHD_USE_STATIC_BUF) uint8* dhd_os_prealloc(void *osh, int section, uint size); @@ -202,6 +231,7 @@ typedef struct dhd_pub { struct dhd_bus *bus; /* Bus module handle */ struct dhd_prot *prot; /* Protocol module handle */ struct dhd_info *info; /* Info module handle */ + struct dhd_cmn *cmn; /* dhd_common module handle */ /* Internal dhd items */ bool up; /* Driver up/down (to OS) */ @@ -250,10 +280,6 @@ typedef struct dhd_pub { /* Suspend disable flag and "in suspend" flag */ int suspend_disable_flag; /* "1" to disable all extra powersaving during suspend */ int in_suspend; /* flag set to 1 when early suspend called */ -#ifdef PNO_SUPPORT - int pno_enable; /* pno status : "1" is pno enable */ - int pno_suspend; /* pno suspend status : "1" is pno suspended */ -#endif /* PNO_SUPPORT */ /* DTIM skip value, default 0(or 1) means wake each DTIM * 3 means skip 2 DTIMs and wake up 3rd DTIM(9th beacon when AP DTIM is 3) */ @@ -277,9 +303,6 @@ typedef struct dhd_pub { */ /* #define WL_ENABLE_P2P_IF 1 */ -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) && defined(CONFIG_HAS_WAKELOCK) - struct wake_lock wakelock[WAKE_LOCK_MAX]; -#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) && defined (CONFIG_HAS_WAKELOCK) */ #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25)) && 1 struct mutex wl_start_stop_lock; /* lock/unlock for Android start/stop */ struct mutex wl_softap_lock; /* lock/unlock for any SoftAP/STA settings */ @@ -289,8 +312,22 @@ typedef struct dhd_pub { uint16 maxdatablks; #endif /* WLBTAMP */ #ifdef PROP_TXSTATUS - int wlfc_enabled; - void* wlfc_state; + int wlfc_enabled; + void* wlfc_state; + int ptx_opt_enabled; + bool pending_tx_pkts; + + /* + * implement below functions in each platform if needed. + */ + /* platform specific function whether to skip flow control */ + bool (*skip_fc)(void); + /* platform specific function for wlfc_enable and wlfc_deinit */ + void (*plat_enable)(void *dhd); + void (*plat_deinit)(void *dhd); +#endif +#ifdef PNO_SUPPORT + void *pno_state; #endif #ifdef ROAM_AP_ENV_DETECTION bool roam_env_detection; @@ -300,16 +337,17 @@ typedef struct dhd_pub { int hang_was_sent; int rxcnt_timeout; /* counter rxcnt timeout to send HANG */ int txcnt_timeout; /* counter txcnt timeout to send HANG */ + bool hang_report; /* enable hang report by default */ #ifdef WLMEDIA_HTSF uint8 htsfdlystat_sz; /* Size of delay stats, max 255B */ +#endif +#ifdef WLTDLS + bool tdls_enable; #endif struct reorder_info *reorder_bufs[WLHOST_REORDERDATA_MAXFLOWS]; + char fw_capabilities[WLC_IOCTL_SMLEN]; #ifdef RXFRAME_THREAD -#ifdef CUSTOMER_HW4 #define MAXSKBPEND 1024 -#else -#define MAXSKBPEND 0x10000 -#endif void *skbbuf[MAXSKBPEND]; uint32 store_idx; uint32 sent_idx; @@ -318,19 +356,21 @@ typedef struct dhd_pub { int tcp_ack_info_cnt; tcp_ack_info_t tcp_ack_info_tbl[MAXTCPSTREAMS]; #endif /* DHDTCPACK_SUPPRESS */ -#if defined(ARP_OFFLOAD_SUPPORT) uint32 arp_version; -#endif #if defined(BCMSUP_4WAY_HANDSHAKE) && defined(WLAN_AKM_SUITE_FT_8021X) bool fw_4way_handshake; /* Whether firmware will to do the 4way handshake. */ #endif #if defined(CUSTOMER_HW4) bool dhd_bug_on; -#endif /* CUSTOMER_HW4 */ +#endif } dhd_pub_t; #if defined(CUSTOMER_HW4) #define MAX_RESCHED_CNT 600 -#endif /* CUSTOMER_HW4 */ +#endif +typedef struct dhd_cmn { + osl_t *osh; /* OSL handle */ + dhd_pub_t *dhd; +} dhd_cmn_t; #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) && defined(CONFIG_PM_SLEEP) @@ -405,6 +445,7 @@ extern int dhd_os_wake_unlock(dhd_pub_t *pub); extern int dhd_os_wake_lock_timeout(dhd_pub_t *pub); extern int dhd_os_wake_lock_rx_timeout_enable(dhd_pub_t *pub, int val); extern int dhd_os_wake_lock_ctrl_timeout_enable(dhd_pub_t *pub, int val); +extern int dhd_os_wake_lock_ctrl_timeout_cancel(dhd_pub_t *pub); extern int dhd_os_wd_wake_lock(dhd_pub_t *pub); extern int dhd_os_wd_wake_unlock(dhd_pub_t *pub); @@ -460,6 +501,12 @@ inline static void MUTEX_UNLOCK_SOFTAP_SET(dhd_pub_t * dhdp) val, __FUNCTION__, __LINE__); \ dhd_os_wake_lock_ctrl_timeout_enable(pub, val); \ } while (0) +#define DHD_OS_WAKE_LOCK_CTRL_TIMEOUT_CANCEL(publ) \ + do { \ + printf("call wake_lock_ctrl_timeout_cancel: %s %d\n", \ + val, __FUNCTION__, __LINE__); \ + dhd_os_wake_lock_ctrl_timeout_cancel(pub); \ + } while (0) #else #define DHD_OS_WAKE_LOCK(pub) dhd_os_wake_lock(pub) #define DHD_OS_WAKE_UNLOCK(pub) dhd_os_wake_unlock(pub) @@ -470,13 +517,12 @@ inline static void MUTEX_UNLOCK_SOFTAP_SET(dhd_pub_t * dhdp) dhd_os_wake_lock_rx_timeout_enable(pub, val) #define DHD_OS_WAKE_LOCK_CTRL_TIMEOUT_ENABLE(pub, val) \ dhd_os_wake_lock_ctrl_timeout_enable(pub, val) +#define DHD_OS_WAKE_LOCK_CTRL_TIMEOUT_CANCEL(pub) \ + dhd_os_wake_lock_ctrl_timeout_cancel(pub) #endif /* DHD_DEBUG_WAKE_LOCK */ -#define DHD_PACKET_TIMEOUT_MS 1000 +#define DHD_PACKET_TIMEOUT_MS 500 #define DHD_EVENT_TIMEOUT_MS 1500 -#if defined(CUSTOMER_HW4) && defined(PNO_SUPPORT) -#define DHD_PNO_TIMEOUT_MS 10000 -#endif /* interface operations (register, remove) should be atomic, use this lock to prevent race * condition among wifi on/off and interface operation functions @@ -484,9 +530,11 @@ inline static void MUTEX_UNLOCK_SOFTAP_SET(dhd_pub_t * dhdp) void dhd_net_if_lock(struct net_device *dev); void dhd_net_if_unlock(struct net_device *dev); +#if defined(MULTIPLE_SUPPLICANT) #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25)) && 1 && 1 extern struct mutex _dhd_sdio_mutex_lock_; #endif +#endif /* MULTIPLE_SUPPLICANT */ typedef struct dhd_if_event { uint8 ifidx; @@ -544,6 +592,9 @@ extern void dhd_free(dhd_pub_t *dhdp); /* Indication from bus module to change flow-control state */ extern void dhd_txflowcontrol(dhd_pub_t *dhdp, int ifidx, bool on); +/* Store the status of a connection attempt for later retrieval by an iovar */ +extern void dhd_store_conn_status(uint32 event, uint32 status, uint32 reason); + extern bool dhd_prec_enq(dhd_pub_t *dhdp, struct pktq *q, void *pkt, int prec); /* Receive frame for delivery to OS. Callee disposes of rxp. */ @@ -588,19 +639,12 @@ extern void dhd_os_sdlock_eventq(dhd_pub_t * pub); extern void dhd_os_sdunlock_eventq(dhd_pub_t * pub); extern bool dhd_os_check_hang(dhd_pub_t *dhdp, int ifidx, int ret); extern int dhd_os_send_hang_message(dhd_pub_t *dhdp); +extern void dhd_set_version_info(dhd_pub_t *pub, char *fw); + +#if defined(KEEP_ALIVE) +extern int dhd_keep_alive_onoff(dhd_pub_t *dhd); +#endif /* KEEP_ALIVE */ -#ifdef PNO_SUPPORT -extern int dhd_pno_enable(dhd_pub_t *dhd, int pfn_enabled); -extern int dhd_pno_clean(dhd_pub_t *dhd); -extern int dhd_pno_set(dhd_pub_t *dhd, wlc_ssid_t* ssids_local, int nssid, - ushort scan_fr, int pno_repeat, int pno_freq_expo_max); -extern int dhd_pno_get_status(dhd_pub_t *dhd); -extern int dhd_dev_pno_reset(struct net_device *dev); -extern int dhd_dev_pno_set(struct net_device *dev, wlc_ssid_t* ssids_local, - int nssid, ushort scan_fr, int pno_repeat, int pno_freq_expo_max); -extern int dhd_dev_pno_enable(struct net_device *dev, int pfn_enabled); -extern int dhd_dev_get_pno_status(struct net_device *dev); -#endif /* PNO_SUPPORT */ #ifdef PKT_FILTER_SUPPORT #define DHD_UNICAST_FILTER_NUM 0 @@ -648,8 +692,8 @@ extern void wl_event_to_host_order(wl_event_msg_t * evt); extern int dhd_wl_ioctl(dhd_pub_t *dhd_pub, int ifindex, wl_ioctl_t *ioc, void *buf, int len); extern int dhd_wl_ioctl_cmd(dhd_pub_t *dhd_pub, int cmd, void *arg, int len, uint8 set, int ifindex); - extern void dhd_common_init(osl_t *osh); +extern void dhd_common_deinit(dhd_pub_t *dhd_pub, dhd_cmn_t *sa_cmn); extern int dhd_do_driver_init(struct net_device *net); extern int dhd_add_if(struct dhd_info *dhd, int ifidx, void *handle, @@ -677,13 +721,15 @@ extern int dhd_bus_membytes(dhd_pub_t *dhdp, bool set, uint32 address, uint8 *da extern void dhd_print_buf(void *pbuf, int len, int bytes_per_line); extern bool dhd_is_associated(dhd_pub_t *dhd, void *bss_buf, int *retval); extern uint dhd_bus_chip_id(dhd_pub_t *dhdp); +extern uint dhd_bus_chiprev_id(dhd_pub_t *dhdp); +extern uint dhd_bus_chippkg_id(dhd_pub_t *dhdp); #if defined(KEEP_ALIVE) extern int dhd_keep_alive_onoff(dhd_pub_t *dhd); #endif /* KEEP_ALIVE */ extern bool dhd_is_concurrent_mode(dhd_pub_t *dhd); - +extern int dhd_iovar(dhd_pub_t *pub, int ifidx, char *name, char *cmd_buf, uint cmd_len, int set); typedef enum cust_gpio_modes { WLAN_RESET_ON, WLAN_RESET_OFF, @@ -776,30 +822,57 @@ extern uint dhd_force_tx_queueing; #define CUSTOM_ROAM_DELTA_SETTING DEFAULT_ROAM_DELTA_VALUE #endif +/* hooks for custom PNO Event wake lock to guarantee enough time + for the Platform to detect Event before system suspended +*/ +#define DEFAULT_PNO_EVENT_LOCK_xTIME 2 /* multiplay of DHD_PACKET_TIMEOUT_MS */ +#ifndef CUSTOM_PNO_EVENT_LOCK_xTIME +#define CUSTOM_PNO_EVENT_LOCK_xTIME DEFAULT_PNO_EVENT_LOCK_xTIME +#endif /* hooks for custom dhd_dpc_prio setting option via Makefile */ #define DEFAULT_DHP_DPC_PRIO 1 #ifndef CUSTOM_DPC_PRIO_SETTING #define CUSTOM_DPC_PRIO_SETTING DEFAULT_DHP_DPC_PRIO #endif +#ifndef CUSTOM_LISTEN_INTERVAL +#define CUSTOM_LISTEN_INTERVAL LISTEN_INTERVAL +#endif /* CUSTOM_LISTEN_INTERVAL */ + #define DEFAULT_SUSPEND_BCN_LI_DTIM 3 #ifndef CUSTOM_SUSPEND_BCN_LI_DTIM #define CUSTOM_SUSPEND_BCN_LI_DTIM DEFAULT_SUSPEND_BCN_LI_DTIM #endif -#define DEFAULT_WIFI_TURNOFF_DELAY 0 +#define DEFAULT_WIFI_TURNOFF_DELAY 0 #ifndef WIFI_TURNOFF_DELAY -#define WIFI_TURNOFF_DELAY DEFAULT_WIFI_TURNOFF_DELAY +#define WIFI_TURNOFF_DELAY DEFAULT_WIFI_TURNOFF_DELAY #endif /* WIFI_TURNOFF_DELAY */ #ifdef RXFRAME_THREAD #ifndef CUSTOM_RXF_PRIO_SETTING -#define CUSTOM_RXF_PRIO_SETTING (DEFAULT_DHP_DPC_PRIO + 1) +#define CUSTOM_RXF_PRIO_SETTING MAX((CUSTOM_DPC_PRIO_SETTING - 1), 1) #endif #endif /* RXFRAME_THREAD */ -#define MAX_DTIM_SKIP_BEACON_ITERVAL 100 /* max allowed associated AP beacon for dtim skip */ +#ifdef WLTDLS +#ifndef CUSTOM_TDLS_IDLE_MODE_SETTING +#define CUSTOM_TDLS_IDLE_MODE_SETTING 60000 /* 60sec to tear down TDLS of not active */ +#endif +#ifndef CUSTOM_TDLS_RSSI_THRESHOLD_HIGH +#define CUSTOM_TDLS_RSSI_THRESHOLD_HIGH -70 /* rssi threshold for establishing TDLS link */ +#endif +#ifndef CUSTOM_TDLS_RSSI_THRESHOLD_LOW +#define CUSTOM_TDLS_RSSI_THRESHOLD_LOW -80 /* rssi threshold for tearing down TDLS link */ +#endif +#endif /* WLTDLS */ + +#define MAX_DTIM_SKIP_BEACON_INTERVAL 100 /* max allowed associated AP beacon for DTIM skip */ +#ifndef MAX_DTIM_ALLOWED_INTERVAL +#define MAX_DTIM_ALLOWED_INTERVAL 600 /* max allowed total beacon interval for DTIM skip */ +#endif +#define NO_DTIM_SKIP 1 #ifdef SDTEST /* Echo packet generator (SDIO), pkts/s */ extern uint dhd_pktgen; @@ -815,6 +888,7 @@ extern uint dhd_pktgen_len; extern char fw_path[MOD_PARAM_PATHLEN]; extern char nv_path[MOD_PARAM_PATHLEN]; +#define MOD_PARAM_INFOLEN 512 #ifdef SOFTAP extern char fw_path2[MOD_PARAM_PATHLEN]; #endif @@ -839,6 +913,8 @@ int dhd_deepsleep(struct net_device *dev, int flag); /* Please be mindful that total pkttag space is 32 octets only */ typedef struct dhd_pkttag { /* + b[14:13] - encryption exemption + b[12 ] - 1 = event channel b[11 ] - 1 = this packet was sent in response to one time packet request, do not increment credit on status for this one. [WLFC_CTL_TYPE_MAC_REQUEST_PACKET]. b[10 ] - 1 = signal-only-packet to firmware [i.e. nothing to piggyback on] @@ -889,6 +965,12 @@ typedef struct dhd_pkttag { #define DHD_PKTTAG_ONETIMEPKTRQST_MASK 0x1 #define DHD_PKTTAG_ONETIMEPKTRQST_SHIFT 11 +#define DHD_PKTTAG_EVENT_MASK 0x1 +#define DHD_PKTTAG_EVENT_SHIFT 12 + +#define DHD_PKTTAG_EXEMPT_MASK 0x3 +#define DHD_PKTTAG_EXEMPT_SHIFT 13 + #define DHD_PKTTAG_PKTDIR_MASK 0x1 #define DHD_PKTTAG_PKTDIR_SHIFT 9 @@ -942,11 +1024,28 @@ typedef struct dhd_pkttag { #define DHD_PKTTAG_ONETIMEPKTRQST(tag) ((((dhd_pkttag_t*)(tag))->if_flags >> \ DHD_PKTTAG_ONETIMEPKTRQST_SHIFT) & DHD_PKTTAG_ONETIMEPKTRQST_MASK) +#define DHD_PKTTAG_SETEVENT(tag, event) ((dhd_pkttag_t*)(tag))->if_flags = \ + (((dhd_pkttag_t*)(tag))->if_flags & \ + ~(DHD_PKTTAG_EVENT_MASK << DHD_PKTTAG_EVENT_SHIFT)) | \ + (((event) & DHD_PKTTAG_EVENT_MASK) << DHD_PKTTAG_EVENT_SHIFT) +#define DHD_PKTTAG_EVENT(tag) ((((dhd_pkttag_t*)(tag))->if_flags >> \ + DHD_PKTTAG_EVENT_SHIFT) & DHD_PKTTAG_EVENT_MASK) + +#define DHD_PKTTAG_EXEMPT_SET(tag, value) ((dhd_pkttag_t*)(tag))->if_flags = \ + (((dhd_pkttag_t*)(tag))->if_flags & \ + ~(DHD_PKTTAG_EXEMPT_MASK << DHD_PKTTAG_EXEMPT_SHIFT)) | \ + (((value) & DHD_PKTTAG_EXEMPT_MASK) << DHD_PKTTAG_EXEMPT_SHIFT) +#define DHD_PKTTAG_EXEMPT(tag) ((((dhd_pkttag_t*)(tag))->if_flags >> \ + DHD_PKTTAG_EXEMPT_SHIFT) & DHD_PKTTAG_EXEMPT_MASK) + #define DHD_PKTTAG_SETDSTN(tag, dstn_MAC_ea) memcpy(((dhd_pkttag_t*)((tag)))->dstn_ether, \ (dstn_MAC_ea), ETHER_ADDR_LEN) #define DHD_PKTTAG_DSTN(tag) ((dhd_pkttag_t*)(tag))->dstn_ether typedef int (*f_commitpkt_t)(void* ctx, void* p); +int dhd_os_wlfc_block(dhd_pub_t *pub); +int dhd_os_wlfc_unblock(dhd_pub_t *pub); +void dhd_schedule_tx(struct dhd_info *dhd); #ifdef PROP_TXSTATUS_DEBUG #define DHD_WLFC_CTRINC_MAC_CLOSE(entry) do { (entry)->closed_ct++; } while (0) @@ -966,19 +1065,7 @@ extern void dhd_wait_event_wakeup(dhd_pub_t*dhd); NdisStallExecution(1); #define IFUNLOCK(lock) InterlockedExchange((lock), 0) #define IFLOCK_FREE(lock) - -#ifdef PNO_SUPPORT -extern int dhd_pno_enable(dhd_pub_t *dhd, int pfn_enabled); -extern int dhd_pnoenable(dhd_pub_t *dhd, int pfn_enabled); -extern int dhd_pno_clean(dhd_pub_t *dhd); -extern int dhd_pno_set(dhd_pub_t *dhd, wlc_ssid_t* ssids_local, int nssid, - ushort scan_fr, int pno_repeat, int pno_freq_expo_max); -extern int dhd_pno_get_status(dhd_pub_t *dhd); -extern int dhd_pno_set_add(dhd_pub_t *dhd, wl_pfn_t *netinfo, int nssid, ushort scan_fr, - ushort slowscan_fr, uint8 pno_repeat, uint8 pno_freq_expo_max, int16 flags); -extern int dhd_pno_cfg(dhd_pub_t *dhd, wl_pfn_cfg_t *pcfg); -extern int dhd_pno_suspend(dhd_pub_t *dhd, int pfn_suspend); -#endif /* PNO_SUPPORT */ +#define FW_SUPPORTED(dhd, capa) ((strstr(dhd->fw_capabilities, #capa) != NULL)) #ifdef ARP_OFFLOAD_SUPPORT #define MAX_IPV4_ENTRIES 8 void dhd_arp_offload_set(dhd_pub_t * dhd, int arp_mode); @@ -990,14 +1077,28 @@ void dhd_aoe_arp_clr(dhd_pub_t *dhd, int idx); int dhd_arp_get_arp_hostip_table(dhd_pub_t *dhd, void *buf, int buflen, int idx); void dhd_arp_offload_add_ip(dhd_pub_t *dhd, uint32 ipaddr, int idx); #endif /* ARP_OFFLOAD_SUPPORT */ - +#ifdef WLTDLS +int dhd_tdls_enable(struct net_device *dev, bool tdls_on, bool auto_on, struct ether_addr *mac); +#endif +/* Neighbor Discovery Offload Support */ +int dhd_ndo_enable(dhd_pub_t * dhd, int ndo_enable); +int dhd_ndo_add_ip(dhd_pub_t *dhd, char* ipaddr, int idx); +int dhd_ndo_remove_ip(dhd_pub_t *dhd, int idx); /* ioctl processing for nl80211 */ int dhd_ioctl_process(dhd_pub_t *pub, int ifidx, struct dhd_ioctl *ioc); -#if defined(CUSTOMER_HW4) && defined(SUPPORT_MULTIPLE_REVISION) +#if defined(SUPPORT_MULTIPLE_REVISION) extern int concate_revision(struct dhd_bus *bus, char *fwpath, int fw_path_len, char *nvpath, int nv_path_len); -#endif /* CUSTOMER_HW4 && SUPPORT_MULTIPLE_REVISION */ +#if defined(PLATFORM_MPS) +extern int wifi_get_fw_nv_path(char *fw, char *nv); +#endif +#endif /* SUPPORT_MULTIPLE_REVISION */ +void dhd_bus_update_fw_nv_path(struct dhd_bus *bus, char *pfw_path, char *pnv_path); +void dhd_set_bus_state(void *bus, uint32 state); + +/* Remove proper pkts(either one no-frag pkt or whole fragmented pkts) */ +extern bool dhd_prec_drop_pkts(osl_t *osh, struct pktq *pq, int prec); #if defined(CUSTOMER_HW4) && defined(USE_WFA_CERT_CONF) enum { diff --git a/drivers/net/wireless/bcmdhd/dhd_bta.c b/drivers/net/wireless/bcmdhd/dhd_bta.c index 15c605ea248..c7dd6574e1d 100644 --- a/drivers/net/wireless/bcmdhd/dhd_bta.c +++ b/drivers/net/wireless/bcmdhd/dhd_bta.c @@ -1,7 +1,7 @@ /* * BT-AMP support routines * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -21,7 +21,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: dhd_bta.c 303834 2011-12-20 06:17:39Z $ + * $Id: dhd_bta.c 379512 2013-01-17 22:49:08Z $ */ #ifndef WLBTAMP #error "WLBTAMP is not defined" @@ -313,6 +313,9 @@ dhd_bta_doevt(dhd_pub_t *dhdp, void *data_buf, uint data_len) { amp_hci_event_t *evt = (amp_hci_event_t *)data_buf; + ASSERT(dhdp); + ASSERT(evt); + switch (evt->ecode) { case HCI_Command_Complete: { cmd_complete_parms_t *parms = (cmd_complete_parms_t *)evt->parms; diff --git a/drivers/net/wireless/bcmdhd/dhd_bta.h b/drivers/net/wireless/bcmdhd/dhd_bta.h index 0337f15d285..73ccea1683f 100644 --- a/drivers/net/wireless/bcmdhd/dhd_bta.h +++ b/drivers/net/wireless/bcmdhd/dhd_bta.h @@ -1,7 +1,7 @@ /* * BT-AMP support routines * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd/dhd_bus.h b/drivers/net/wireless/bcmdhd/dhd_bus.h index 5f2c9ea234a..5b922ef0c37 100644 --- a/drivers/net/wireless/bcmdhd/dhd_bus.h +++ b/drivers/net/wireless/bcmdhd/dhd_bus.h @@ -4,7 +4,7 @@ * Provides type definitions and function prototypes used to link the * DHD OS, bus, and protocol modules. * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd/dhd_cdc.c b/drivers/net/wireless/bcmdhd/dhd_cdc.c index 365dbbf6b7a..71a644936ab 100644 --- a/drivers/net/wireless/bcmdhd/dhd_cdc.c +++ b/drivers/net/wireless/bcmdhd/dhd_cdc.c @@ -1,7 +1,7 @@ /* * DHD Protocol Module for CDC and BDC. * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -21,7 +21,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: dhd_cdc.c 424070 2013-09-16 05:39:06Z $ + * $Id: dhd_cdc.c 444875 2013-12-22 07:29:44Z $ * * BDC is like CDC, except it includes a header for data packets to convey * packet priority over the bus, and flags (e.g. to indicate checksum status @@ -57,23 +57,6 @@ * round off at the end of buffer */ -#define BUS_RETRIES 1 /* # of retries before aborting a bus tx operation */ - -#ifdef PROP_TXSTATUS -typedef struct dhd_wlfc_commit_info { - uint8 needs_hdr; - uint8 ac_fifo_credit_spent; - ewlfc_packet_state_t pkt_type; - wlfc_mac_descriptor_t* mac_entry; - void* p; -} dhd_wlfc_commit_info_t; -#endif /* PROP_TXSTATUS */ - -#if defined(CUSTOMER_HW4) && defined(USE_DYNAMIC_F2_BLKSIZE) -extern uint sd_f2_blocksize; -extern int dhdsdio_func_blocksize(dhd_pub_t *dhd, int function_num, int block_size); -#endif /* CUSTOMER_HW4 && USE_DYNAMIC_F2_BLKSIZE */ - typedef struct dhd_prot { uint16 reqid; uint8 pending; @@ -209,7 +192,6 @@ dhdcdc_query_ioctl(dhd_pub_t *dhd, int ifidx, uint cmd, void *buf, uint len, uin goto done; } - /* Copy info buffer */ if (buf) { @@ -257,15 +239,22 @@ dhdcdc_set_ioctl(dhd_pub_t *dhd, int ifidx, uint cmd, void *buf, uint len, uint8 return -EIO; } -#ifdef CUSTOMER_HW4 +#if defined(CUSTOMER_HW4) if (cmd == WLC_SET_PM) { -#ifdef CONFIG_CONTROL_PM +#if defined(CONFIG_CONTROL_PM) || defined(CONFIG_PM_LOCK) if (g_pm_control == TRUE) { DHD_ERROR(("%s: SET PM ignored!(Requested:%d)\n", __FUNCTION__, *(char *)buf)); goto done; } #endif /* CONFIG_CONTROL_PM */ +#if defined(WLAIBSS) + if (dhd->op_mode == DHD_FLAG_IBSS_MODE) { + DHD_ERROR(("%s: SET PM ignored for IBSS!(Requested:%d)\n", + __FUNCTION__, *(char *)buf)); + goto done; + } +#endif DHD_ERROR(("%s: SET PM to %d\n", __FUNCTION__, *(char *)buf)); } #endif /* CUSTOMER_HW4 */ @@ -320,26 +309,11 @@ dhd_prot_ioctl(dhd_pub_t *dhd, int ifidx, wl_ioctl_t * ioc, void * buf, int len) dhd_prot_t *prot = dhd->prot; int ret = -1; uint8 action; -#if defined(NDIS630) - bool acquired = FALSE; -#endif if ((dhd->busstate == DHD_BUS_DOWN) || dhd->hang_was_sent) { DHD_ERROR(("%s : bus is down. we have nothing to do\n", __FUNCTION__)); goto done; } -#if defined(NDIS630) - if (dhd_os_proto_block(dhd)) - { - acquired = TRUE; - } - else - { - /* attempt to acquire protocol mutex timed out. */ - ret = -1; - return ret; - } -#endif /* NDIS630 */ DHD_TRACE(("%s: Enter\n", __FUNCTION__)); @@ -390,10 +364,7 @@ dhd_prot_ioctl(dhd_pub_t *dhd, int ifidx, wl_ioctl_t * ioc, void * buf, int len) prot->pending = FALSE; done: -#if defined(NDIS630) - if (acquired) - dhd_os_proto_unblock(dhd); -#endif + return ret; } @@ -404,2441 +375,153 @@ dhd_prot_iovar_op(dhd_pub_t *dhdp, const char *name, return BCME_UNSUPPORTED; } -#ifdef PROP_TXSTATUS void -dhd_wlfc_dump(dhd_pub_t *dhdp, struct bcmstrbuf *strbuf) +dhd_prot_dump(dhd_pub_t *dhdp, struct bcmstrbuf *strbuf) { - int i; - uint8* ea; - athost_wl_status_info_t* wlfc = (athost_wl_status_info_t*) - dhdp->wlfc_state; - wlfc_hanger_t* h; - wlfc_mac_descriptor_t* mac_table; - wlfc_mac_descriptor_t* interfaces; - char* iftypes[] = {"STA", "AP", "WDS", "p2pGO", "p2pCL"}; - - if (wlfc == NULL) { - bcm_bprintf(strbuf, "wlfc not initialized yet\n"); - return; - } - h = (wlfc_hanger_t*)wlfc->hanger; - if (h == NULL) { - bcm_bprintf(strbuf, "wlfc-hanger not initialized yet\n"); - } - - mac_table = wlfc->destination_entries.nodes; - interfaces = wlfc->destination_entries.interfaces; - bcm_bprintf(strbuf, "---- wlfc stats ----\n"); - if (h) { - bcm_bprintf(strbuf, "wlfc hanger (pushed,popped,f_push," - "f_pop,f_slot, pending) = (%d,%d,%d,%d,%d,%d)\n", - h->pushed, - h->popped, - h->failed_to_push, - h->failed_to_pop, - h->failed_slotfind, - (h->pushed - h->popped)); - } - - bcm_bprintf(strbuf, "wlfc fail(tlv,credit_rqst,mac_update,psmode_update), " - "(dq_full,rollback_fail) = (%d,%d,%d,%d), (%d,%d)\n", - wlfc->stats.tlv_parse_failed, - wlfc->stats.credit_request_failed, - wlfc->stats.mac_update_failed, - wlfc->stats.psmode_update_failed, - wlfc->stats.delayq_full_error, - wlfc->stats.rollback_failed); - - bcm_bprintf(strbuf, "PKTS (credit,sent) " - "(AC0[%d,%d],AC1[%d,%d],AC2[%d,%d],AC3[%d,%d],BC_MC[%d,%d])\n", - wlfc->FIFO_credit[0], wlfc->stats.send_pkts[0], - wlfc->FIFO_credit[1], wlfc->stats.send_pkts[1], - wlfc->FIFO_credit[2], wlfc->stats.send_pkts[2], - wlfc->FIFO_credit[3], wlfc->stats.send_pkts[3], - wlfc->FIFO_credit[4], wlfc->stats.send_pkts[4]); - - bcm_bprintf(strbuf, "\n"); - for (i = 0; i < WLFC_MAX_IFNUM; i++) { - if (interfaces[i].occupied) { - char* iftype_desc; - - if (interfaces[i].iftype > WLC_E_IF_ROLE_P2P_CLIENT) - iftype_desc = "hostif_flow_state[i] == OFF) - ? " OFF":" ON")); - - bcm_bprintf(strbuf, "INTERFACE[%d].DELAYQ(len,state,credit)" - "= (%d,%s,%d)\n", - i, - interfaces[i].psq.len, - ((interfaces[i].state == - WLFC_STATE_OPEN) ? " OPEN":"CLOSE"), - interfaces[i].requested_credit); - - bcm_bprintf(strbuf, "INTERFACE[%d].DELAYQ" - "(sup,ac0),(sup,ac1),(sup,ac2),(sup,ac3) = " - "(%d,%d),(%d,%d),(%d,%d),(%d,%d)\n", - i, - interfaces[i].psq.q[0].len, - interfaces[i].psq.q[1].len, - interfaces[i].psq.q[2].len, - interfaces[i].psq.q[3].len, - interfaces[i].psq.q[4].len, - interfaces[i].psq.q[5].len, - interfaces[i].psq.q[6].len, - interfaces[i].psq.q[7].len); - } - } - - bcm_bprintf(strbuf, "\n"); - for (i = 0; i < WLFC_MAC_DESC_TABLE_SIZE; i++) { - if (mac_table[i].occupied) { - ea = mac_table[i].ea; - bcm_bprintf(strbuf, "MAC_table[%d].ea = " - "[%02x:%02x:%02x:%02x:%02x:%02x], if:%d \n", i, - ea[0], ea[1], ea[2], ea[3], ea[4], ea[5], - mac_table[i].interface_id); - - bcm_bprintf(strbuf, "MAC_table[%d].DELAYQ(len,state,credit)" - "= (%d,%s,%d)\n", - i, - mac_table[i].psq.len, - ((mac_table[i].state == - WLFC_STATE_OPEN) ? " OPEN":"CLOSE"), - mac_table[i].requested_credit); -#ifdef PROP_TXSTATUS_DEBUG - bcm_bprintf(strbuf, "MAC_table[%d]: (opened, closed) = (%d, %d)\n", - i, mac_table[i].opened_ct, mac_table[i].closed_ct); + bcm_bprintf(strbuf, "Protocol CDC: reqid %d\n", dhdp->prot->reqid); +#ifdef PROP_TXSTATUS + if (dhdp->wlfc_state) + dhd_wlfc_dump(dhdp, strbuf); #endif - bcm_bprintf(strbuf, "MAC_table[%d].DELAYQ" - "(sup,ac0),(sup,ac1),(sup,ac2),(sup,ac3) = " - "(%d,%d),(%d,%d),(%d,%d),(%d,%d)\n", - i, - mac_table[i].psq.q[0].len, - mac_table[i].psq.q[1].len, - mac_table[i].psq.q[2].len, - mac_table[i].psq.q[3].len, - mac_table[i].psq.q[4].len, - mac_table[i].psq.q[5].len, - mac_table[i].psq.q[6].len, - mac_table[i].psq.q[7].len); - } - } - -#ifdef PROP_TXSTATUS_DEBUG - { - int avg; - int moving_avg = 0; - int moving_samples; - - if (wlfc->stats.latency_sample_count) { - moving_samples = sizeof(wlfc->stats.deltas)/sizeof(uint32); - - for (i = 0; i < moving_samples; i++) - moving_avg += wlfc->stats.deltas[i]; - moving_avg /= moving_samples; - - avg = (100 * wlfc->stats.total_status_latency) / - wlfc->stats.latency_sample_count; - bcm_bprintf(strbuf, "txstatus latency (average, last, moving[%d]) = " - "(%d.%d, %03d, %03d)\n", - moving_samples, avg/100, (avg - (avg/100)*100), - wlfc->stats.latency_most_recent, - moving_avg); - } - } - - bcm_bprintf(strbuf, "wlfc- fifo[0-5] credit stats: sent = (%d,%d,%d,%d,%d,%d), " - "back = (%d,%d,%d,%d,%d,%d)\n", - wlfc->stats.fifo_credits_sent[0], - wlfc->stats.fifo_credits_sent[1], - wlfc->stats.fifo_credits_sent[2], - wlfc->stats.fifo_credits_sent[3], - wlfc->stats.fifo_credits_sent[4], - wlfc->stats.fifo_credits_sent[5], - - wlfc->stats.fifo_credits_back[0], - wlfc->stats.fifo_credits_back[1], - wlfc->stats.fifo_credits_back[2], - wlfc->stats.fifo_credits_back[3], - wlfc->stats.fifo_credits_back[4], - wlfc->stats.fifo_credits_back[5]); - { - uint32 fifo_cr_sent = 0; - uint32 fifo_cr_acked = 0; - uint32 request_cr_sent = 0; - uint32 request_cr_ack = 0; - uint32 bc_mc_cr_ack = 0; - - for (i = 0; i < sizeof(wlfc->stats.fifo_credits_sent)/sizeof(uint32); i++) { - fifo_cr_sent += wlfc->stats.fifo_credits_sent[i]; - } - - for (i = 0; i < sizeof(wlfc->stats.fifo_credits_back)/sizeof(uint32); i++) { - fifo_cr_acked += wlfc->stats.fifo_credits_back[i]; - } - - for (i = 0; i < WLFC_MAC_DESC_TABLE_SIZE; i++) { - if (wlfc->destination_entries.nodes[i].occupied) { - request_cr_sent += - wlfc->destination_entries.nodes[i].dstncredit_sent_packets; - } - } - for (i = 0; i < WLFC_MAX_IFNUM; i++) { - if (wlfc->destination_entries.interfaces[i].occupied) { - request_cr_sent += - wlfc->destination_entries.interfaces[i].dstncredit_sent_packets; - } - } - for (i = 0; i < WLFC_MAC_DESC_TABLE_SIZE; i++) { - if (wlfc->destination_entries.nodes[i].occupied) { - request_cr_ack += - wlfc->destination_entries.nodes[i].dstncredit_acks; - } - } - for (i = 0; i < WLFC_MAX_IFNUM; i++) { - if (wlfc->destination_entries.interfaces[i].occupied) { - request_cr_ack += - wlfc->destination_entries.interfaces[i].dstncredit_acks; - } - } - bcm_bprintf(strbuf, "wlfc- (sent, status) => pq(%d,%d), vq(%d,%d)," - "other:%d, bc_mc:%d, signal-only, (sent,freed): (%d,%d)", - fifo_cr_sent, fifo_cr_acked, - request_cr_sent, request_cr_ack, - wlfc->destination_entries.other.dstncredit_acks, - bc_mc_cr_ack, - wlfc->stats.signal_only_pkts_sent, wlfc->stats.signal_only_pkts_freed); - } -#endif /* PROP_TXSTATUS_DEBUG */ - bcm_bprintf(strbuf, "\n"); - bcm_bprintf(strbuf, "wlfc- pkt((in,2bus,txstats,hdrpull),(dropped,hdr_only,wlc_tossed)" - "(freed,free_err,rollback)) = " - "((%d,%d,%d,%d),(%d,%d,%d),(%d,%d,%d))\n", - wlfc->stats.pktin, - wlfc->stats.pkt2bus, - wlfc->stats.txstatus_in, - wlfc->stats.dhd_hdrpulls, - - wlfc->stats.pktdropped, - wlfc->stats.wlfc_header_only_pkt, - wlfc->stats.wlc_tossed_pkts, - - wlfc->stats.pkt_freed, - wlfc->stats.pkt_free_err, wlfc->stats.rollback); - - bcm_bprintf(strbuf, "wlfc- suppress((d11,wlc,err),enq(d11,wl,hq,mac?),retx(d11,wlc,hq)) = " - "((%d,%d,%d),(%d,%d,%d,%d),(%d,%d,%d))\n", - - wlfc->stats.d11_suppress, - wlfc->stats.wl_suppress, - wlfc->stats.bad_suppress, - - wlfc->stats.psq_d11sup_enq, - wlfc->stats.psq_wlsup_enq, - wlfc->stats.psq_hostq_enq, - wlfc->stats.mac_handle_notfound, - - wlfc->stats.psq_d11sup_retx, - wlfc->stats.psq_wlsup_retx, - wlfc->stats.psq_hostq_retx); - bcm_bprintf(strbuf, "wlfc- generic error: %d", wlfc->stats.generic_error); - - return; } -/* Create a place to store all packet pointers submitted to the firmware until - a status comes back, suppress or otherwise. - - hang-er: noun, a contrivance on which things are hung, as a hook. +/* The FreeBSD PKTPUSH could change the packet buf pinter + so we need to make it changable */ -static void* -dhd_wlfc_hanger_create(osl_t *osh, int max_items) -{ - int i; - wlfc_hanger_t* hanger; - - /* allow only up to a specific size for now */ - ASSERT(max_items == WLFC_HANGER_MAXITEMS); - - if ((hanger = (wlfc_hanger_t*)MALLOC(osh, WLFC_HANGER_SIZE(max_items))) == NULL) - return NULL; - - memset(hanger, 0, WLFC_HANGER_SIZE(max_items)); - hanger->max_items = max_items; - - for (i = 0; i < hanger->max_items; i++) { - hanger->items[i].state = WLFC_HANGER_ITEM_STATE_FREE; - } - return hanger; -} - -static int -dhd_wlfc_hanger_delete(osl_t *osh, void* hanger) -{ - wlfc_hanger_t* h = (wlfc_hanger_t*)hanger; - - if (h) { - MFREE(osh, h, WLFC_HANGER_SIZE(h->max_items)); - return BCME_OK; - } - return BCME_BADARG; -} - -static uint16 -dhd_wlfc_hanger_get_free_slot(void* hanger) -{ - uint32 i; - wlfc_hanger_t* h = (wlfc_hanger_t*)hanger; - - if (h) { - i = h->slot_pos + 1; - if (i == h->max_items) { - i = 0; - } - while (i != h->slot_pos) { - if (h->items[i].state == WLFC_HANGER_ITEM_STATE_FREE) { - h->slot_pos = i; - return (uint16)i; - } - i++; - if (i == h->max_items) - i = 0; - } - h->failed_slotfind++; - } - return WLFC_HANGER_MAXITEMS; -} - -static int -dhd_wlfc_hanger_get_genbit(void* hanger, void* pkt, uint32 slot_id, int* gen) -{ - int rc = BCME_OK; - wlfc_hanger_t* h = (wlfc_hanger_t*)hanger; - - *gen = 0xff; - - /* this packet was not pushed at the time it went to the firmware */ - if (slot_id == WLFC_HANGER_MAXITEMS) - return BCME_NOTFOUND; - - if (h) { - if ((h->items[slot_id].state == WLFC_HANGER_ITEM_STATE_INUSE) || - (h->items[slot_id].state == WLFC_HANGER_ITEM_STATE_INUSE_SUPPRESSED)) { - *gen = h->items[slot_id].gen; - } - else { - rc = BCME_NOTFOUND; - } - } - else - rc = BCME_BADARG; - return rc; -} - -static int -dhd_wlfc_hanger_pushpkt(void* hanger, void* pkt, uint32 slot_id) -{ - int rc = BCME_OK; - wlfc_hanger_t* h = (wlfc_hanger_t*)hanger; - - if (h && (slot_id < WLFC_HANGER_MAXITEMS)) { - if (h->items[slot_id].state == WLFC_HANGER_ITEM_STATE_FREE) { - h->items[slot_id].state = WLFC_HANGER_ITEM_STATE_INUSE; - h->items[slot_id].pkt = pkt; - h->items[slot_id].identifier = slot_id; - h->pushed++; - } - else { - h->failed_to_push++; - rc = BCME_NOTFOUND; - } - } - else - rc = BCME_BADARG; - return rc; -} - -static int -dhd_wlfc_hanger_poppkt(void* hanger, uint32 slot_id, void** pktout, int remove_from_hanger) -{ - int rc = BCME_OK; - wlfc_hanger_t* h = (wlfc_hanger_t*)hanger; - - /* this packet was not pushed at the time it went to the firmware */ - if (slot_id == WLFC_HANGER_MAXITEMS) - return BCME_NOTFOUND; - - if (h) { - if (h->items[slot_id].state != WLFC_HANGER_ITEM_STATE_FREE) { - *pktout = h->items[slot_id].pkt; - if (remove_from_hanger) { - h->items[slot_id].state = - WLFC_HANGER_ITEM_STATE_FREE; - h->items[slot_id].pkt = NULL; - h->items[slot_id].identifier = 0; - h->items[slot_id].gen = 0xff; - h->popped++; - } - } - else { - h->failed_to_pop++; - rc = BCME_NOTFOUND; - } - } - else - rc = BCME_BADARG; - return rc; -} - -static int -dhd_wlfc_hanger_mark_suppressed(void* hanger, uint32 slot_id, uint8 gen) -{ - int rc = BCME_OK; - wlfc_hanger_t* h = (wlfc_hanger_t*)hanger; - - /* this packet was not pushed at the time it went to the firmware */ - if (slot_id == WLFC_HANGER_MAXITEMS) - return BCME_NOTFOUND; - if (h) { - h->items[slot_id].gen = gen; - if (h->items[slot_id].state == WLFC_HANGER_ITEM_STATE_INUSE) { - h->items[slot_id].state = WLFC_HANGER_ITEM_STATE_INUSE_SUPPRESSED; - } - else - rc = BCME_BADARG; - } - else - rc = BCME_BADARG; - - return rc; -} - -static int -_dhd_wlfc_pushheader(athost_wl_status_info_t* ctx, void* p, bool tim_signal, - uint8 tim_bmp, uint8 mac_handle, uint32 htodtag) +#define PKTBUF pktbuf +void +dhd_prot_hdrpush(dhd_pub_t *dhd, int ifidx, void *PKTBUF) { - uint32 wl_pktinfo = 0; - uint8* wlh; - uint8 dataOffset; - uint8 fillers; - uint8 tim_signal_len = 0; - +#ifdef BDC struct bdc_header *h; +#endif /* BDC */ - if (tim_signal) { - tim_signal_len = 1 + 1 + WLFC_CTL_VALUE_LEN_PENDING_TRAFFIC_BMP; - } - - /* +2 is for Type[1] and Len[1] in TLV, plus TIM signal */ - dataOffset = WLFC_CTL_VALUE_LEN_PKTTAG + 2 + tim_signal_len; - fillers = ROUNDUP(dataOffset, 4) - dataOffset; - dataOffset += fillers; - - PKTPUSH(ctx->osh, p, dataOffset); - wlh = (uint8*) PKTDATA(ctx->osh, p); + DHD_TRACE(("%s: Enter\n", __FUNCTION__)); - wl_pktinfo = htol32(htodtag); +#ifdef BDC + /* Push BDC header used to convey priority for buses that don't */ - wlh[0] = WLFC_CTL_TYPE_PKTTAG; - wlh[1] = WLFC_CTL_VALUE_LEN_PKTTAG; - memcpy(&wlh[2], &wl_pktinfo, sizeof(uint32)); + PKTPUSH(dhd->osh, PKTBUF, BDC_HEADER_LEN); - if (tim_signal_len) { - wlh[dataOffset - fillers - tim_signal_len ] = - WLFC_CTL_TYPE_PENDING_TRAFFIC_BMP; - wlh[dataOffset - fillers - tim_signal_len + 1] = - WLFC_CTL_VALUE_LEN_PENDING_TRAFFIC_BMP; - wlh[dataOffset - fillers - tim_signal_len + 2] = mac_handle; - wlh[dataOffset - fillers - tim_signal_len + 3] = tim_bmp; - } - if (fillers) - memset(&wlh[dataOffset - fillers], WLFC_CTL_TYPE_FILLER, fillers); + h = (struct bdc_header *)PKTDATA(dhd->osh, PKTBUF); - PKTPUSH(ctx->osh, p, BDC_HEADER_LEN); - h = (struct bdc_header *)PKTDATA(ctx->osh, p); h->flags = (BDC_PROTO_VER << BDC_FLAG_VER_SHIFT); - if (PKTSUMNEEDED(p)) + if (PKTSUMNEEDED(PKTBUF)) h->flags |= BDC_FLAG_SUM_NEEDED; - h->priority = (PKTPRIO(p) & BDC_PRIORITY_MASK); + h->priority = (PKTPRIO(PKTBUF) & BDC_PRIORITY_MASK); h->flags2 = 0; - h->dataOffset = dataOffset >> 2; - BDC_SET_IF_IDX(h, DHD_PKTTAG_IF(PKTTAG(p))); - return BCME_OK; + h->dataOffset = 0; +#endif /* BDC */ + BDC_SET_IF_IDX(h, ifidx); } +#undef PKTBUF /* Only defined in the above routine */ -static int -_dhd_wlfc_pullheader(athost_wl_status_info_t* ctx, void* pktbuf) +int +dhd_prot_hdrpull(dhd_pub_t *dhd, int *ifidx, void *pktbuf, uchar *reorder_buf_info, + uint *reorder_info_len) { +#ifdef BDC struct bdc_header *h; +#endif + uint8 data_offset = 0; - if (PKTLEN(ctx->osh, pktbuf) < BDC_HEADER_LEN) { - WLFC_DBGMESG(("%s: rx data too short (%d < %d)\n", __FUNCTION__, - PKTLEN(ctx->osh, pktbuf), BDC_HEADER_LEN)); - return BCME_ERROR; - } - h = (struct bdc_header *)PKTDATA(ctx->osh, pktbuf); + DHD_TRACE(("%s: Enter\n", __FUNCTION__)); - /* pull BDC header */ - PKTPULL(ctx->osh, pktbuf, BDC_HEADER_LEN); +#ifdef BDC + if (reorder_info_len) + *reorder_info_len = 0; + /* Pop BDC header used to convey priority for buses that don't */ - if (PKTLEN(ctx->osh, pktbuf) < (h->dataOffset << 2)) { - WLFC_DBGMESG(("%s: rx data too short (%d < %d)\n", __FUNCTION__, - PKTLEN(ctx->osh, pktbuf), (h->dataOffset << 2))); + if (PKTLEN(dhd->osh, pktbuf) < BDC_HEADER_LEN) { + DHD_ERROR(("%s: rx data too short (%d < %d)\n", __FUNCTION__, + PKTLEN(dhd->osh, pktbuf), BDC_HEADER_LEN)); return BCME_ERROR; } - /* pull wl-header */ - PKTPULL(ctx->osh, pktbuf, (h->dataOffset << 2)); - return BCME_OK; -} + h = (struct bdc_header *)PKTDATA(dhd->osh, pktbuf); -static wlfc_mac_descriptor_t* -_dhd_wlfc_find_table_entry(athost_wl_status_info_t* ctx, void* p) -{ - int i; - wlfc_mac_descriptor_t* table = ctx->destination_entries.nodes; - uint8 ifid = DHD_PKTTAG_IF(PKTTAG(p)); - uint8* dstn = DHD_PKTTAG_DSTN(PKTTAG(p)); - - if (((ctx->destination_entries.interfaces[ifid].iftype == WLC_E_IF_ROLE_STA) || - ETHER_ISMULTI(dstn) || - (ctx->destination_entries.interfaces[ifid].iftype == WLC_E_IF_ROLE_P2P_CLIENT)) && - (ctx->destination_entries.interfaces[ifid].occupied)) { - return &ctx->destination_entries.interfaces[ifid]; + if (!ifidx) { + /* for tx packet, skip the analysis */ + data_offset = h->dataOffset; + PKTPULL(dhd->osh, pktbuf, BDC_HEADER_LEN); + goto exit; } - for (i = 0; i < WLFC_MAC_DESC_TABLE_SIZE; i++) { - if (table[i].occupied) { - if (table[i].interface_id == ifid) { - if (!memcmp(table[i].ea, dstn, ETHER_ADDR_LEN)) - return &table[i]; - } - } + if ((*ifidx = BDC_GET_IF_IDX(h)) >= DHD_MAX_IFS) { + DHD_ERROR(("%s: rx data ifnum out of range (%d)\n", + __FUNCTION__, *ifidx)); + return BCME_ERROR; } - return &ctx->destination_entries.other; -} - -static int -_dhd_wlfc_rollback_packet_toq(athost_wl_status_info_t* ctx, - void* p, ewlfc_packet_state_t pkt_type, uint32 hslot) -{ - /* - put the packet back to the head of queue - - - suppressed packet goes back to suppress sub-queue - - pull out the header, if new or delayed packet - - Note: hslot is used only when header removal is done. - */ - wlfc_mac_descriptor_t* entry; - void* pktout; - int rc = BCME_OK; - int prec; - - entry = _dhd_wlfc_find_table_entry(ctx, p); - prec = DHD_PKTTAG_FIFO(PKTTAG(p)); - if (entry != NULL) { - if (pkt_type == eWLFC_PKTTYPE_SUPPRESSED) { - /* wl-header is saved for suppressed packets */ - if (WLFC_PKTQ_PENQ_HEAD(&entry->psq, ((prec << 1) + 1), p) == NULL) { - WLFC_DBGMESG(("Error: %s():%d\n", __FUNCTION__, __LINE__)); - rc = BCME_ERROR; - } - } - else { - /* remove header first */ - rc = _dhd_wlfc_pullheader(ctx, p); - if (rc != BCME_OK) { - WLFC_DBGMESG(("Error: %s():%d\n", __FUNCTION__, __LINE__)); - /* free the hanger slot */ - dhd_wlfc_hanger_poppkt(ctx->hanger, hslot, &pktout, 1); - PKTFREE(ctx->osh, p, TRUE); - rc = BCME_ERROR; - return rc; - } - - if (pkt_type == eWLFC_PKTTYPE_DELAYED) { - /* delay-q packets are going to delay-q */ - if (WLFC_PKTQ_PENQ_HEAD(&entry->psq, (prec << 1), p) == NULL) { - WLFC_DBGMESG(("Error: %s():%d\n", __FUNCTION__, __LINE__)); - rc = BCME_ERROR; - } - } - - /* free the hanger slot */ - dhd_wlfc_hanger_poppkt(ctx->hanger, hslot, &pktout, 1); - /* decrement sequence count */ - WLFC_DECR_SEQCOUNT(entry, prec); - } - /* - if this packet did not count against FIFO credit, it must have - taken a requested_credit from the firmware (for pspoll etc.) - */ - if (!DHD_PKTTAG_CREDITCHECK(PKTTAG(p))) { - entry->requested_credit++; - } + if (((h->flags & BDC_FLAG_VER_MASK) >> BDC_FLAG_VER_SHIFT) != BDC_PROTO_VER) { + DHD_ERROR(("%s: non-BDC packet received, flags = 0x%x\n", + dhd_ifname(dhd, *ifidx), h->flags)); + if (((h->flags & BDC_FLAG_VER_MASK) >> BDC_FLAG_VER_SHIFT) == BDC_PROTO_VER_1) + h->dataOffset = 0; + else + return BCME_ERROR; } - else { - WLFC_DBGMESG(("Error: %s():%d\n", __FUNCTION__, __LINE__)); - rc = BCME_ERROR; + + if (h->flags & BDC_FLAG_SUM_GOOD) { + DHD_INFO(("%s: BDC packet received with good rx-csum, flags 0x%x\n", + dhd_ifname(dhd, *ifidx), h->flags)); + PKTSETSUMGOOD(pktbuf, TRUE); } - if (rc != BCME_OK) - ctx->stats.rollback_failed++; - else - ctx->stats.rollback++; - return rc; -} + PKTSETPRIO(pktbuf, (h->priority & BDC_PRIORITY_MASK)); + data_offset = h->dataOffset; + PKTPULL(dhd->osh, pktbuf, BDC_HEADER_LEN); +#endif /* BDC */ -static void -_dhd_wlfc_flow_control_check(athost_wl_status_info_t* ctx, struct pktq* pq, uint8 if_id) -{ - if ((pq->len <= WLFC_FLOWCONTROL_LOWATER) && (ctx->hostif_flow_state[if_id] == ON)) { - /* start traffic */ - ctx->hostif_flow_state[if_id] = OFF; +#ifdef PROP_TXSTATUS + dhd_os_wlfc_block(dhd); + if (dhd->wlfc_state && + ((athost_wl_status_info_t*)dhd->wlfc_state)->proptxstatus_mode + != WLFC_FCMODE_NONE && + (!DHD_PKTTAG_PKTDIR(PKTTAG(pktbuf)))) { /* - WLFC_DBGMESG(("qlen:%02d, if:%02d, ->OFF, start traffic %s()\n", - pq->len, if_id, __FUNCTION__)); + - parse txstatus only for packets that came from the firmware */ - WLFC_DBGMESG(("F")); - - dhd_txflowcontrol(ctx->dhdp, if_id, OFF); + dhd_wlfc_parse_header_info(dhd, pktbuf, (data_offset << 2), + reorder_buf_info, reorder_info_len); + ((athost_wl_status_info_t*)dhd->wlfc_state)->stats.dhd_hdrpulls++; - ctx->toggle_host_if = 0; } - if ((pq->len >= WLFC_FLOWCONTROL_HIWATER) && (ctx->hostif_flow_state[if_id] == OFF)) { - /* stop traffic */ - ctx->hostif_flow_state[if_id] = ON; - /* - WLFC_DBGMESG(("qlen:%02d, if:%02d, ->ON, stop traffic %s()\n", - pq->len, if_id, __FUNCTION__)); - */ - WLFC_DBGMESG(("N")); - - dhd_txflowcontrol(ctx->dhdp, if_id, ON); + dhd_os_wlfc_unblock(dhd); +#endif /* PROP_TXSTATUS */ - ctx->host_ifidx = if_id; - ctx->toggle_host_if = 1; - } - return; +exit: + PKTPULL(dhd->osh, pktbuf, (data_offset << 2)); + return 0; } -static int -_dhd_wlfc_send_signalonly_packet(athost_wl_status_info_t* ctx, wlfc_mac_descriptor_t* entry, - uint8 ta_bmp) +#if defined(PROP_TXSTATUS) +void +dhd_wlfc_trigger_pktcommit(dhd_pub_t *dhd) { - int rc = BCME_OK; - void* p = NULL; - int dummylen = ((dhd_pub_t *)ctx->dhdp)->hdrlen+ 12; - - /* allocate a dummy packet */ - p = PKTGET(ctx->osh, dummylen, TRUE); - if (p) { - PKTPULL(ctx->osh, p, dummylen); - DHD_PKTTAG_SET_H2DTAG(PKTTAG(p), 0); - _dhd_wlfc_pushheader(ctx, p, TRUE, ta_bmp, entry->mac_handle, 0); - DHD_PKTTAG_SETSIGNALONLY(PKTTAG(p), 1); -#ifdef PROP_TXSTATUS_DEBUG - ctx->stats.signal_only_pkts_sent++; -#endif - rc = dhd_bus_txdata(((dhd_pub_t *)ctx->dhdp)->bus, p); - if (rc != BCME_OK) { - PKTFREE(ctx->osh, p, TRUE); - } - } - else { - DHD_ERROR(("%s: couldn't allocate new %d-byte packet\n", - __FUNCTION__, dummylen)); - rc = BCME_NOMEM; + dhd_os_wlfc_block(dhd); + if (dhd->wlfc_state && + (((athost_wl_status_info_t*)dhd->wlfc_state)->proptxstatus_mode + != WLFC_FCMODE_NONE)) { + dhd_wlfc_commit_packets(dhd->wlfc_state, (f_commitpkt_t)dhd_bus_txdata, + (void *)dhd->bus, NULL); } - return rc; + dhd_os_wlfc_unblock(dhd); } +#endif -/* Return TRUE if traffic availability changed */ -static bool -_dhd_wlfc_traffic_pending_check(athost_wl_status_info_t* ctx, wlfc_mac_descriptor_t* entry, - int prec) -{ - bool rc = FALSE; - if (entry->state == WLFC_STATE_CLOSE) { - if ((pktq_plen(&entry->psq, (prec << 1)) == 0) && - (pktq_plen(&entry->psq, ((prec << 1) + 1)) == 0)) { +int +dhd_prot_attach(dhd_pub_t *dhd) +{ + dhd_prot_t *cdc; - if (entry->traffic_pending_bmp & NBITVAL(prec)) { - rc = TRUE; - entry->traffic_pending_bmp = - entry->traffic_pending_bmp & ~ NBITVAL(prec); - } - } - else { - if (!(entry->traffic_pending_bmp & NBITVAL(prec))) { - rc = TRUE; - entry->traffic_pending_bmp = - entry->traffic_pending_bmp | NBITVAL(prec); - } - } - } - if (rc) { - /* request a TIM update to firmware at the next piggyback opportunity */ - if (entry->traffic_lastreported_bmp != entry->traffic_pending_bmp) { - entry->send_tim_signal = 1; - _dhd_wlfc_send_signalonly_packet(ctx, entry, entry->traffic_pending_bmp); - entry->traffic_lastreported_bmp = entry->traffic_pending_bmp; - entry->send_tim_signal = 0; - } - else { - rc = FALSE; - } - } - return rc; -} - -static int -_dhd_wlfc_enque_suppressed(athost_wl_status_info_t* ctx, int prec, void* p) -{ - wlfc_mac_descriptor_t* entry; - - entry = _dhd_wlfc_find_table_entry(ctx, p); - if (entry == NULL) { - WLFC_DBGMESG(("Error: %s():%d\n", __FUNCTION__, __LINE__)); - return BCME_NOTFOUND; - } - /* - - suppressed packets go to sub_queue[2*prec + 1] AND - - delayed packets go to sub_queue[2*prec + 0] to ensure - order of delivery. - */ - if (WLFC_PKTQ_PENQ(&entry->psq, ((prec << 1) + 1), p) == NULL) { - ctx->stats.delayq_full_error++; - /* WLFC_DBGMESG(("Error: %s():%d\n", __FUNCTION__, __LINE__)); */ - WLFC_DBGMESG(("s")); - return BCME_ERROR; - } - /* A packet has been pushed, update traffic availability bitmap, if applicable */ - _dhd_wlfc_traffic_pending_check(ctx, entry, prec); - _dhd_wlfc_flow_control_check(ctx, &entry->psq, DHD_PKTTAG_IF(PKTTAG(p))); - return BCME_OK; -} - -static int -_dhd_wlfc_pretx_pktprocess(athost_wl_status_info_t* ctx, - wlfc_mac_descriptor_t* entry, void* p, int header_needed, uint32* slot) -{ - int rc = BCME_OK; - int hslot = WLFC_HANGER_MAXITEMS; - bool send_tim_update = FALSE; - uint32 htod = 0; - uint8 free_ctr; - - *slot = hslot; - - if (entry == NULL) { - entry = _dhd_wlfc_find_table_entry(ctx, p); - } - - if (entry == NULL) { - WLFC_DBGMESG(("Error: %s():%d\n", __FUNCTION__, __LINE__)); - return BCME_ERROR; - } - if (entry->send_tim_signal) { - send_tim_update = TRUE; - entry->send_tim_signal = 0; - entry->traffic_lastreported_bmp = entry->traffic_pending_bmp; - } - if (header_needed) { - hslot = dhd_wlfc_hanger_get_free_slot(ctx->hanger); - free_ctr = WLFC_SEQCOUNT(entry, DHD_PKTTAG_FIFO(PKTTAG(p))); - DHD_PKTTAG_SET_H2DTAG(PKTTAG(p), htod); - WLFC_PKTFLAG_SET_GENERATION(htod, entry->generation); - entry->transit_count++; - } - else { - hslot = WLFC_PKTID_HSLOT_GET(DHD_PKTTAG_H2DTAG(PKTTAG(p))); - free_ctr = WLFC_PKTID_FREERUNCTR_GET(DHD_PKTTAG_H2DTAG(PKTTAG(p))); - } - WLFC_PKTID_HSLOT_SET(htod, hslot); - WLFC_PKTID_FREERUNCTR_SET(htod, free_ctr); - DHD_PKTTAG_SETPKTDIR(PKTTAG(p), 1); - WL_TXSTATUS_SET_FLAGS(htod, WLFC_PKTFLAG_PKTFROMHOST); - WL_TXSTATUS_SET_FIFO(htod, DHD_PKTTAG_FIFO(PKTTAG(p))); - - - if (!DHD_PKTTAG_CREDITCHECK(PKTTAG(p))) { - /* - Indicate that this packet is being sent in response to an - explicit request from the firmware side. - */ - WLFC_PKTFLAG_SET_PKTREQUESTED(htod); - } - else { - WLFC_PKTFLAG_CLR_PKTREQUESTED(htod); - } - if (header_needed) { - rc = _dhd_wlfc_pushheader(ctx, p, send_tim_update, - entry->traffic_lastreported_bmp, entry->mac_handle, htod); - if (rc == BCME_OK) { - DHD_PKTTAG_SET_H2DTAG(PKTTAG(p), htod); - /* - a new header was created for this packet. - push to hanger slot and scrub q. Since bus - send succeeded, increment seq number as well. - */ - rc = dhd_wlfc_hanger_pushpkt(ctx->hanger, p, hslot); - if (rc == BCME_OK) { - /* increment free running sequence count */ - WLFC_INCR_SEQCOUNT(entry, DHD_PKTTAG_FIFO(PKTTAG(p))); -#ifdef PROP_TXSTATUS_DEBUG - ((wlfc_hanger_t*)(ctx->hanger))->items[hslot].push_time = - OSL_SYSUPTIME(); -#endif - } - else { - WLFC_DBGMESG(("%s() hanger_pushpkt() failed, rc: %d\n", - __FUNCTION__, rc)); - } - } - } - else { - int gen; - - /* remove old header */ - rc = _dhd_wlfc_pullheader(ctx, p); - if (rc == BCME_OK) { - hslot = WLFC_PKTID_HSLOT_GET(DHD_PKTTAG_H2DTAG(PKTTAG(p))); - dhd_wlfc_hanger_get_genbit(ctx->hanger, p, hslot, &gen); - - WLFC_PKTFLAG_SET_GENERATION(htod, gen); - free_ctr = WLFC_PKTID_FREERUNCTR_GET(DHD_PKTTAG_H2DTAG(PKTTAG(p))); - /* push new header */ - _dhd_wlfc_pushheader(ctx, p, send_tim_update, - entry->traffic_lastreported_bmp, entry->mac_handle, htod); - } - } - *slot = hslot; - return rc; -} - -static int -_dhd_wlfc_is_destination_closed(athost_wl_status_info_t* ctx, - wlfc_mac_descriptor_t* entry, int prec) -{ - if (ctx->destination_entries.interfaces[entry->interface_id].iftype == - WLC_E_IF_ROLE_P2P_GO) { - /* - destination interface is of type p2p GO. - For a p2pGO interface, if the destination is OPEN but the interface is - CLOSEd, do not send traffic. But if the dstn is CLOSEd while there is - destination-specific-credit left send packets. This is because the - firmware storing the destination-specific-requested packet in queue. - */ - if ((entry->state == WLFC_STATE_CLOSE) && (entry->requested_credit == 0) && - (entry->requested_packet == 0)) - return 1; - } - /* AP, p2p_go -> unicast desc entry, STA/p2p_cl -> interface desc. entry */ - if (((entry->state == WLFC_STATE_CLOSE) && (entry->requested_credit == 0) && - (entry->requested_packet == 0)) || - (!(entry->ac_bitmap & (1 << prec)))) - return 1; - - return 0; -} - -static void* -_dhd_wlfc_deque_delayedq(athost_wl_status_info_t* ctx, - int prec, uint8* ac_credit_spent, uint8* needs_hdr, wlfc_mac_descriptor_t** entry_out) -{ - wlfc_mac_descriptor_t* entry; - wlfc_mac_descriptor_t* table; - uint8 token_pos; - int total_entries; - void* p = NULL; - int pout; - int i; - - *entry_out = NULL; - token_pos = ctx->token_pos[prec]; - /* most cases a packet will count against FIFO credit */ - *ac_credit_spent = 1; - *needs_hdr = 1; - - /* search all entries, include nodes as well as interfaces */ - table = (wlfc_mac_descriptor_t*)&ctx->destination_entries; - total_entries = sizeof(ctx->destination_entries)/sizeof(wlfc_mac_descriptor_t); - - for (i = 0; i < total_entries; i++) { - entry = &table[(token_pos + i) % total_entries]; - if (entry->occupied) { - if (!_dhd_wlfc_is_destination_closed(ctx, entry, prec)) { - p = pktq_mdeq(&entry->psq, - /* higher precedence will be picked up first, - * i.e. suppressed packets before delayed ones - */ - NBITVAL((prec << 1) + 1), &pout); - *needs_hdr = 0; - - if (p == NULL) { - if (entry->suppressed == TRUE) { - if ((entry->suppr_transit_count <= - entry->suppress_count)) { - entry->suppressed = FALSE; - } else { - return NULL; - } - } - /* De-Q from delay Q */ - p = pktq_mdeq(&entry->psq, - NBITVAL((prec << 1)), - &pout); - *needs_hdr = 1; - } - - if (p != NULL) { - /* did the packet come from suppress sub-queue? */ - if (entry->requested_credit > 0) { - entry->requested_credit--; -#ifdef PROP_TXSTATUS_DEBUG - entry->dstncredit_sent_packets++; -#endif - /* - if the packet was pulled out while destination is in - closed state but had a non-zero packets requested, - then this should not count against the FIFO credit. - That is due to the fact that the firmware will - most likely hold onto this packet until a suitable - time later to push it to the appropriate AC FIFO. - */ - if (entry->state == WLFC_STATE_CLOSE) - *ac_credit_spent = 0; - } - else if (entry->requested_packet > 0) { - entry->requested_packet--; - DHD_PKTTAG_SETONETIMEPKTRQST(PKTTAG(p)); - if (entry->state == WLFC_STATE_CLOSE) - *ac_credit_spent = 0; - } - /* move token to ensure fair round-robin */ - ctx->token_pos[prec] = - (token_pos + i + 1) % total_entries; - *entry_out = entry; - _dhd_wlfc_flow_control_check(ctx, &entry->psq, - DHD_PKTTAG_IF(PKTTAG(p))); - /* - A packet has been picked up, update traffic - availability bitmap, if applicable - */ - _dhd_wlfc_traffic_pending_check(ctx, entry, prec); - return p; - } - } - } - } - return NULL; -} - -static int -_dhd_wlfc_enque_delayq(athost_wl_status_info_t* ctx, void* pktbuf, int prec) -{ - wlfc_mac_descriptor_t* entry; - - if (pktbuf != NULL) { - entry = _dhd_wlfc_find_table_entry(ctx, pktbuf); - - if (entry == NULL) { - WLFC_DBGMESG(("Error: %s():%d\n", __FUNCTION__, __LINE__)); - return BCME_ERROR; - } - - /* - - suppressed packets go to sub_queue[2*prec + 1] AND - - delayed packets go to sub_queue[2*prec + 0] to ensure - order of delivery. - */ - if (WLFC_PKTQ_PENQ(&entry->psq, (prec << 1), pktbuf) == NULL) { - WLFC_DBGMESG(("D")); - /* dhd_txcomplete(ctx->dhdp, p, FALSE); */ - PKTFREE(ctx->osh, pktbuf, TRUE); - ctx->stats.delayq_full_error++; - return BCME_ERROR; - } - /* - A packet has been pushed, update traffic availability bitmap, - if applicable - */ - _dhd_wlfc_traffic_pending_check(ctx, entry, prec); - - } - return BCME_OK; -} - -bool ifpkt_fn(void* p, int ifid) -{ - return (ifid == DHD_PKTTAG_IF(PKTTAG(p))); -} - -static int -_dhd_wlfc_mac_entry_update(athost_wl_status_info_t* ctx, wlfc_mac_descriptor_t* entry, - ewlfc_mac_entry_action_t action, uint8 ifid, uint8 iftype, uint8* ea) -{ - int rc = BCME_OK; - - if (action == eWLFC_MAC_ENTRY_ACTION_ADD) { - entry->occupied = 1; - entry->state = WLFC_STATE_OPEN; - entry->requested_credit = 0; - entry->interface_id = ifid; - entry->iftype = iftype; - entry->ac_bitmap = 0xff; /* update this when handling APSD */ - /* for an interface entry we may not care about the MAC address */ - if (ea != NULL) - memcpy(&entry->ea[0], ea, ETHER_ADDR_LEN); - pktq_init(&entry->psq, WLFC_PSQ_PREC_COUNT, WLFC_PSQ_LEN); - } - else if (action == eWLFC_MAC_ENTRY_ACTION_UPDATE) { - entry->occupied = 1; - entry->state = WLFC_STATE_OPEN; - entry->requested_credit = 0; - entry->interface_id = ifid; - entry->iftype = iftype; - entry->ac_bitmap = 0xff; /* update this when handling APSD */ - /* for an interface entry we may not care about the MAC address */ - if (ea != NULL) - memcpy(&entry->ea[0], ea, ETHER_ADDR_LEN); - } - else if (action == eWLFC_MAC_ENTRY_ACTION_DEL) { - entry->occupied = 0; - entry->state = WLFC_STATE_CLOSE; - entry->requested_credit = 0; - /* enable after packets are queued-deqeued properly. - pktq_flush(dhd->osh, &entry->psq, FALSE, NULL, 0); - */ - memset(&entry->ea[0], 0, ETHER_ADDR_LEN); - entry->transit_count = 0; - entry->suppr_transit_count = 0; - entry->suppress_count = 0; - entry->suppressed = 0; - } - return rc; -} - -int -_dhd_wlfc_borrow_credit(athost_wl_status_info_t* ctx, uint8 available_credit_map, int borrower_ac) -{ - int lender_ac; - int rc = BCME_ERROR; - - if (ctx == NULL || available_credit_map == 0) { - WLFC_DBGMESG(("Error: %s():%d\n", __FUNCTION__, __LINE__)); - return BCME_BADARG; - } - - /* Borrow from lowest priority available AC (including BC/MC credits) */ - for (lender_ac = 0; lender_ac <= AC_COUNT; lender_ac++) { - if ((available_credit_map && (1 << lender_ac)) && - (ctx->FIFO_credit[lender_ac] > 0)) { - ctx->credits_borrowed[borrower_ac][lender_ac]++; - ctx->FIFO_credit[lender_ac]--; - rc = BCME_OK; - break; - } - } - - return rc; -} - -int -dhd_wlfc_interface_entry_update(void* state, - ewlfc_mac_entry_action_t action, uint8 ifid, uint8 iftype, uint8* ea) -{ - athost_wl_status_info_t* ctx = (athost_wl_status_info_t*)state; - wlfc_mac_descriptor_t* entry; - int ret; - - if (ifid >= WLFC_MAX_IFNUM) - return BCME_BADARG; - - entry = &ctx->destination_entries.interfaces[ifid]; - ret = _dhd_wlfc_mac_entry_update(ctx, entry, action, ifid, iftype, ea); - if (action == eWLFC_MAC_ENTRY_ACTION_DEL) - dhd_wlfc_cleanup(ctx->dhdp, ifpkt_fn, ifid); - return ret; -} - -int -dhd_wlfc_FIFOcreditmap_update(void* state, uint8* credits) -{ - athost_wl_status_info_t* ctx = (athost_wl_status_info_t*)state; - - /* update the AC FIFO credit map */ - ctx->FIFO_credit[0] = credits[0]; - ctx->FIFO_credit[1] = credits[1]; - ctx->FIFO_credit[2] = credits[2]; - ctx->FIFO_credit[3] = credits[3]; - /* credit for bc/mc packets */ - ctx->FIFO_credit[4] = credits[4]; - /* credit for ATIM FIFO is not used yet. */ - ctx->FIFO_credit[5] = 0; - return BCME_OK; -} - -int -_dhd_wlfc_handle_packet_commit(athost_wl_status_info_t* ctx, int ac, - dhd_wlfc_commit_info_t *commit_info, f_commitpkt_t fcommit, void* commit_ctx) -{ - uint32 hslot; - int rc; - - /* - if ac_fifo_credit_spent = 0 - - This packet will not count against the FIFO credit. - To ensure the txstatus corresponding to this packet - does not provide an implied credit (default behavior) - mark the packet accordingly. - - if ac_fifo_credit_spent = 1 - - This is a normal packet and it counts against the FIFO - credit count. - */ - DHD_PKTTAG_SETCREDITCHECK(PKTTAG(commit_info->p), commit_info->ac_fifo_credit_spent); - rc = _dhd_wlfc_pretx_pktprocess(ctx, commit_info->mac_entry, commit_info->p, - commit_info->needs_hdr, &hslot); - - if (rc == BCME_OK) - rc = fcommit(commit_ctx, commit_info->p); - else - ctx->stats.generic_error++; - - if (rc == BCME_OK) { - ctx->stats.pkt2bus++; - if (commit_info->ac_fifo_credit_spent) { - ctx->stats.send_pkts[ac]++; - WLFC_HOST_FIFO_CREDIT_INC_SENTCTRS(ctx, ac); - } - } else if (rc == BCME_NORESOURCE) - rc = BCME_ERROR; - else { - /* - bus commit has failed, rollback. - - remove wl-header for a delayed packet - - save wl-header header for suppressed packets - */ - rc = _dhd_wlfc_rollback_packet_toq(ctx, commit_info->p, - (commit_info->pkt_type), hslot); - if (rc != BCME_OK) - ctx->stats.rollback_failed++; - - rc = BCME_ERROR; - } - - return rc; -} - -int -dhd_wlfc_commit_packets(void* state, f_commitpkt_t fcommit, void* commit_ctx, void *pktbuf) -{ - int ac; - int credit; - int rc; - dhd_wlfc_commit_info_t commit_info; - athost_wl_status_info_t* ctx = (athost_wl_status_info_t*)state; - int credit_count = 0; - int bus_retry_count = 0; - uint8 ac_available = 0; /* Bitmask for 4 ACs + BC/MC */ - - if ((state == NULL) || - (fcommit == NULL)) { - WLFC_DBGMESG(("Error: %s():%d\n", __FUNCTION__, __LINE__)); - return BCME_BADARG; - } - - memset(&commit_info, 0, sizeof(commit_info)); - - /* - Commit packets for regular AC traffic. Higher priority first. - First, use up FIFO credits available to each AC. Based on distribution - and credits left, borrow from other ACs as applicable - - -NOTE: - If the bus between the host and firmware is overwhelmed by the - traffic from host, it is possible that higher priority traffic - starves the lower priority queue. If that occurs often, we may - have to employ weighted round-robin or ucode scheme to avoid - low priority packet starvation. - */ - - if (pktbuf) { - ac = DHD_PKTTAG_FIFO(PKTTAG(pktbuf)); - if (ETHER_ISMULTI(DHD_PKTTAG_DSTN(PKTTAG(pktbuf)))) { - ASSERT(ac == AC_COUNT); - commit_info.needs_hdr = 1; - commit_info.mac_entry = NULL; - commit_info.pkt_type = eWLFC_PKTTYPE_NEW; - commit_info.p = pktbuf; - if (ctx->FIFO_credit[ac]) { - rc = _dhd_wlfc_handle_packet_commit(ctx, ac, &commit_info, - fcommit, commit_ctx); - - /* Bus commits may fail (e.g. flow control); abort after retries */ - if (rc == BCME_OK) { - if (commit_info.ac_fifo_credit_spent) { - (void) _dhd_wlfc_borrow_credit(ctx, - ac_available, ac); - credit_count--; - } - } else { - bus_retry_count++; - if (bus_retry_count >= BUS_RETRIES) { - DHD_ERROR((" %s: bus error %d\n", - __FUNCTION__, rc)); - return rc; - } - } - } - } - else { - /* en-queue the packets to respective queue. */ - rc = _dhd_wlfc_enque_delayq(ctx, pktbuf, ac); - } - } - - for (ac = AC_COUNT; ac >= 0; ac--) { - - int initial_credit_count = ctx->FIFO_credit[ac]; - - /* packets from delayQ with less priority are fresh and they'd need header and - * have no MAC entry - */ - commit_info.needs_hdr = 1; - commit_info.mac_entry = NULL; - commit_info.pkt_type = eWLFC_PKTTYPE_NEW; - - for (credit = 0; credit < ctx->FIFO_credit[ac];) { - commit_info.p = _dhd_wlfc_deque_delayedq(ctx, ac, - &(commit_info.ac_fifo_credit_spent), - &(commit_info.needs_hdr), - &(commit_info.mac_entry)); - - if (commit_info.p == NULL) - break; - - commit_info.pkt_type = (commit_info.needs_hdr) ? eWLFC_PKTTYPE_DELAYED : - eWLFC_PKTTYPE_SUPPRESSED; - - rc = _dhd_wlfc_handle_packet_commit(ctx, ac, &commit_info, - fcommit, commit_ctx); - - /* Bus commits may fail (e.g. flow control); abort after retries */ - if (rc == BCME_OK) { - if (commit_info.ac_fifo_credit_spent) { - credit++; - } - } - else { - bus_retry_count++; - if (bus_retry_count >= BUS_RETRIES) { - DHD_ERROR(("%s: bus error %d\n", __FUNCTION__, rc)); - ctx->FIFO_credit[ac] -= credit; - return rc; - } - } - } - - ctx->FIFO_credit[ac] -= credit; - - - /* If no credits were used, the queue is idle and can be re-used - Note that resv credits cannot be borrowed - */ - if (initial_credit_count == ctx->FIFO_credit[ac]) { - ac_available |= (1 << ac); - credit_count += ctx->FIFO_credit[ac]; - } - } - - /* We borrow only for AC_BE and only if no other traffic seen for DEFER_PERIOD - - Note that (ac_available & WLFC_AC_BE_TRAFFIC_ONLY) is done to: - a) ignore BC/MC for deferring borrow - b) ignore AC_BE being available along with other ACs - (this should happen only for pure BC/MC traffic) - - i.e. AC_VI, AC_VO, AC_BK all MUST be available (i.e. no traffic) and - we do not care if AC_BE and BC/MC are available or not - */ - if ((ac_available & WLFC_AC_BE_TRAFFIC_ONLY) == WLFC_AC_BE_TRAFFIC_ONLY) { - - if (ctx->allow_credit_borrow) { - ac = 1; /* Set ac to AC_BE and borrow credits */ - } - else { - int delta; - int curr_t = OSL_SYSUPTIME(); - - if (curr_t > ctx->borrow_defer_timestamp) - delta = curr_t - ctx->borrow_defer_timestamp; - else - delta = 0xffffffff + curr_t - ctx->borrow_defer_timestamp; - - if (delta >= WLFC_BORROW_DEFER_PERIOD_MS) { - /* Reset borrow but defer to next iteration (defensive borrowing) */ - ctx->allow_credit_borrow = TRUE; - ctx->borrow_defer_timestamp = 0; - } - return BCME_OK; - } - } - else { - /* If we have multiple AC traffic, turn off borrowing, mark time and bail out */ - ctx->allow_credit_borrow = FALSE; - ctx->borrow_defer_timestamp = OSL_SYSUPTIME(); - return BCME_OK; - } - - /* At this point, borrow all credits only for "ac" (which should be set above to AC_BE) - Generically use "ac" only in case we extend to all ACs in future - */ - for (; (credit_count > 0);) { - - commit_info.p = _dhd_wlfc_deque_delayedq(ctx, ac, - &(commit_info.ac_fifo_credit_spent), - &(commit_info.needs_hdr), - &(commit_info.mac_entry)); - if (commit_info.p == NULL) - break; - - commit_info.pkt_type = (commit_info.needs_hdr) ? eWLFC_PKTTYPE_DELAYED : - eWLFC_PKTTYPE_SUPPRESSED; - - rc = _dhd_wlfc_handle_packet_commit(ctx, ac, &commit_info, - fcommit, commit_ctx); - - /* Bus commits may fail (e.g. flow control); abort after retries */ - if (rc == BCME_OK) { - if (commit_info.ac_fifo_credit_spent) { - (void) _dhd_wlfc_borrow_credit(ctx, ac_available, ac); - credit_count--; - } - } - else { - bus_retry_count++; - if (bus_retry_count >= BUS_RETRIES) { - DHD_ERROR(("%s: bus error %d\n", __FUNCTION__, rc)); - return rc; - } - } - } - - return BCME_OK; -} - -static uint8 -dhd_wlfc_find_mac_desc_id_from_mac(dhd_pub_t *dhdp, uint8* ea) -{ - wlfc_mac_descriptor_t* table = - ((athost_wl_status_info_t*)dhdp->wlfc_state)->destination_entries.nodes; - uint8 table_index; - - if (ea != NULL) { - for (table_index = 0; table_index < WLFC_MAC_DESC_TABLE_SIZE; table_index++) { - if ((memcmp(ea, &table[table_index].ea[0], ETHER_ADDR_LEN) == 0) && - table[table_index].occupied) - return table_index; - } - } - return WLFC_MAC_DESC_ID_INVALID; -} - -void -dhd_wlfc_txcomplete(dhd_pub_t *dhd, void *txp, bool success) -{ - athost_wl_status_info_t* wlfc = (athost_wl_status_info_t*) - dhd->wlfc_state; - void* p; - int fifo_id; - - if (DHD_PKTTAG_SIGNALONLY(PKTTAG(txp))) { -#ifdef PROP_TXSTATUS_DEBUG - wlfc->stats.signal_only_pkts_freed++; -#endif - /* is this a signal-only packet? */ - if (success) - PKTFREE(wlfc->osh, txp, TRUE); - return; - } - if (!success) { - WLFC_DBGMESG(("At: %s():%d, bus_complete() failure for %p, htod_tag:0x%08x\n", - __FUNCTION__, __LINE__, txp, DHD_PKTTAG_H2DTAG(PKTTAG(txp)))); - dhd_wlfc_hanger_poppkt(wlfc->hanger, WLFC_PKTID_HSLOT_GET(DHD_PKTTAG_H2DTAG - (PKTTAG(txp))), &p, 1); - - /* indicate failure and free the packet */ - dhd_txcomplete(dhd, txp, FALSE); - - /* return the credit, if necessary */ - if (DHD_PKTTAG_CREDITCHECK(PKTTAG(txp))) { - int lender, credit_returned = 0; /* Note that borrower is fifo_id */ - - fifo_id = DHD_PKTTAG_FIFO(PKTTAG(txp)); - - /* Return credits to highest priority lender first */ - for (lender = AC_COUNT; lender >= 0; lender--) { - if (wlfc->credits_borrowed[fifo_id][lender] > 0) { - wlfc->FIFO_credit[lender]++; - wlfc->credits_borrowed[fifo_id][lender]--; - credit_returned = 1; - break; - } - } - - if (!credit_returned) { - wlfc->FIFO_credit[fifo_id]++; - } - } - - PKTFREE(wlfc->osh, txp, TRUE); - } - return; -} - -static int -dhd_wlfc_compressed_txstatus_update(dhd_pub_t *dhd, uint8* pkt_info, uint8 len) -{ - uint8 status_flag; - uint32 status; - int ret; - int remove_from_hanger = 1; - void* pktbuf; - uint8 fifo_id; - uint8 count = 0; - uint32 status_g; - uint32 hslot, hcnt; - wlfc_mac_descriptor_t* entry = NULL; - athost_wl_status_info_t* wlfc = (athost_wl_status_info_t*) - dhd->wlfc_state; - - memcpy(&status, pkt_info, sizeof(uint32)); - status_flag = WL_TXSTATUS_GET_FLAGS(status); - status_g = status & 0xff000000; - hslot = (status & 0x00ffff00) >> 8; - hcnt = status & 0xff; - len = pkt_info[4]; - - wlfc->stats.txstatus_in++; - - if (status_flag == WLFC_CTL_PKTFLAG_DISCARD) { - wlfc->stats.pkt_freed++; - } - - else if (status_flag == WLFC_CTL_PKTFLAG_D11SUPPRESS) { - wlfc->stats.d11_suppress++; - remove_from_hanger = 0; - } - - else if (status_flag == WLFC_CTL_PKTFLAG_WLSUPPRESS) { - wlfc->stats.wl_suppress++; - remove_from_hanger = 0; - } - - else if (status_flag == WLFC_CTL_PKTFLAG_TOSSED_BYWLC) { - wlfc->stats.wlc_tossed_pkts++; - } - while (count < len) { - status = (status_g << 24) | (hslot << 8) | (hcnt); - count++; - hslot++; - hcnt++; - - ret = dhd_wlfc_hanger_poppkt(wlfc->hanger, - WLFC_PKTID_HSLOT_GET(status), &pktbuf, remove_from_hanger); - if (ret != BCME_OK) { - /* do something */ - continue; - } - - entry = _dhd_wlfc_find_table_entry(wlfc, pktbuf); - - if (!remove_from_hanger) { - /* this packet was suppressed */ - if (!entry->suppressed || entry->generation != WLFC_PKTID_GEN(status)) { - entry->suppressed = TRUE; - entry->suppress_count = pktq_mlen(&entry->psq, - NBITVAL((WL_TXSTATUS_GET_FIFO(status) << 1) + 1)); - entry->suppr_transit_count = entry->transit_count; - } - entry->generation = WLFC_PKTID_GEN(status); - } - -#ifdef PROP_TXSTATUS_DEBUG - { - uint32 new_t = OSL_SYSUPTIME(); - uint32 old_t; - uint32 delta; - old_t = ((wlfc_hanger_t*)(wlfc->hanger))->items[ - WLFC_PKTID_HSLOT_GET(status)].push_time; - - - wlfc->stats.latency_sample_count++; - if (new_t > old_t) - delta = new_t - old_t; - else - delta = 0xffffffff + new_t - old_t; - wlfc->stats.total_status_latency += delta; - wlfc->stats.latency_most_recent = delta; - - wlfc->stats.deltas[wlfc->stats.idx_delta++] = delta; - if (wlfc->stats.idx_delta == sizeof(wlfc->stats.deltas)/sizeof(uint32)) - wlfc->stats.idx_delta = 0; - } -#endif /* PROP_TXSTATUS_DEBUG */ - - fifo_id = DHD_PKTTAG_FIFO(PKTTAG(pktbuf)); - - /* pick up the implicit credit from this packet */ - if (DHD_PKTTAG_CREDITCHECK(PKTTAG(pktbuf))) { - if (wlfc->proptxstatus_mode == WLFC_FCMODE_IMPLIED_CREDIT) { - - int lender, credit_returned = 0; /* Note that borrower is fifo_id */ - - /* Return credits to highest priority lender first */ - for (lender = AC_COUNT; lender >= 0; lender--) { - if (wlfc->credits_borrowed[fifo_id][lender] > 0) { - wlfc->FIFO_credit[lender]++; - wlfc->credits_borrowed[fifo_id][lender]--; - credit_returned = 1; - break; - } - } - - if (!credit_returned) { - wlfc->FIFO_credit[fifo_id]++; - } - } - } - else { - /* - if this packet did not count against FIFO credit, it must have - taken a requested_credit from the destination entry (for pspoll etc.) - */ - if (!entry) { - - entry = _dhd_wlfc_find_table_entry(wlfc, pktbuf); - } - if (!DHD_PKTTAG_ONETIMEPKTRQST(PKTTAG(pktbuf))) - entry->requested_credit++; -#ifdef PROP_TXSTATUS_DEBUG - entry->dstncredit_acks++; -#endif - } - if ((status_flag == WLFC_CTL_PKTFLAG_D11SUPPRESS) || - (status_flag == WLFC_CTL_PKTFLAG_WLSUPPRESS)) { - - ret = _dhd_wlfc_enque_suppressed(wlfc, fifo_id, pktbuf); - if (ret != BCME_OK) { - /* delay q is full, drop this packet */ - dhd_wlfc_hanger_poppkt(wlfc->hanger, WLFC_PKTID_HSLOT_GET(status), - &pktbuf, 1); - - /* indicate failure and free the packet */ - dhd_txcomplete(dhd, pktbuf, FALSE); - entry->transit_count--; - /* packet is transmitted Successfully by dongle - * after first suppress. - */ - if (entry->suppressed) { - entry->suppr_transit_count--; - } - PKTFREE(wlfc->osh, pktbuf, TRUE); - } else { - /* Mark suppressed to avoid a double free during wlfc cleanup */ - - dhd_wlfc_hanger_mark_suppressed(wlfc->hanger, - WLFC_PKTID_HSLOT_GET(status), WLFC_PKTID_GEN(status)); - entry->suppress_count++; - } - } - else { - dhd_txcomplete(dhd, pktbuf, TRUE); - entry->transit_count--; - - /* This packet is transmitted Successfully by dongle - * even after first suppress. - */ - if (entry->suppressed) { - entry->suppr_transit_count--; - } - /* free the packet */ - PKTFREE(wlfc->osh, pktbuf, TRUE); - } - } - return BCME_OK; -} - -/* Handle discard or suppress indication */ -static int -dhd_wlfc_txstatus_update(dhd_pub_t *dhd, uint8* pkt_info) -{ - uint8 status_flag; - uint32 status; - int ret; - int remove_from_hanger = 1; - void* pktbuf; - uint8 fifo_id; - wlfc_mac_descriptor_t* entry = NULL; - athost_wl_status_info_t* wlfc = (athost_wl_status_info_t*) - dhd->wlfc_state; - - memcpy(&status, pkt_info, sizeof(uint32)); - status_flag = WL_TXSTATUS_GET_FLAGS(status); - wlfc->stats.txstatus_in++; - - if (status_flag == WLFC_CTL_PKTFLAG_DISCARD) { - wlfc->stats.pkt_freed++; - } - - else if (status_flag == WLFC_CTL_PKTFLAG_D11SUPPRESS) { - wlfc->stats.d11_suppress++; - remove_from_hanger = 0; - } - - else if (status_flag == WLFC_CTL_PKTFLAG_WLSUPPRESS) { - wlfc->stats.wl_suppress++; - remove_from_hanger = 0; - } - - else if (status_flag == WLFC_CTL_PKTFLAG_TOSSED_BYWLC) { - wlfc->stats.wlc_tossed_pkts++; - } - - ret = dhd_wlfc_hanger_poppkt(wlfc->hanger, - WLFC_PKTID_HSLOT_GET(status), &pktbuf, remove_from_hanger); - if (ret != BCME_OK) { - /* do something */ - return ret; - } - - entry = _dhd_wlfc_find_table_entry(wlfc, pktbuf); - - if (!remove_from_hanger) { - /* this packet was suppressed */ - if (!entry->suppressed || entry->generation != WLFC_PKTID_GEN(status)) { - entry->suppressed = TRUE; - entry->suppress_count = pktq_mlen(&entry->psq, - NBITVAL((WL_TXSTATUS_GET_FIFO(status) << 1) + 1)); - entry->suppr_transit_count = entry->transit_count; - } - entry->generation = WLFC_PKTID_GEN(status); - } - -#ifdef PROP_TXSTATUS_DEBUG - { - uint32 new_t = OSL_SYSUPTIME(); - uint32 old_t; - uint32 delta; - old_t = ((wlfc_hanger_t*)(wlfc->hanger))->items[ - WLFC_PKTID_HSLOT_GET(status)].push_time; - - - wlfc->stats.latency_sample_count++; - if (new_t > old_t) - delta = new_t - old_t; - else - delta = 0xffffffff + new_t - old_t; - wlfc->stats.total_status_latency += delta; - wlfc->stats.latency_most_recent = delta; - - wlfc->stats.deltas[wlfc->stats.idx_delta++] = delta; - if (wlfc->stats.idx_delta == sizeof(wlfc->stats.deltas)/sizeof(uint32)) - wlfc->stats.idx_delta = 0; - } -#endif /* PROP_TXSTATUS_DEBUG */ - - fifo_id = DHD_PKTTAG_FIFO(PKTTAG(pktbuf)); - - /* pick up the implicit credit from this packet */ - if (DHD_PKTTAG_CREDITCHECK(PKTTAG(pktbuf))) { - if (wlfc->proptxstatus_mode == WLFC_FCMODE_IMPLIED_CREDIT) { - - int lender, credit_returned = 0; /* Note that borrower is fifo_id */ - - /* Return credits to highest priority lender first */ - for (lender = AC_COUNT; lender >= 0; lender--) { - if (wlfc->credits_borrowed[fifo_id][lender] > 0) { - wlfc->FIFO_credit[lender]++; - wlfc->credits_borrowed[fifo_id][lender]--; - credit_returned = 1; - break; - } - } - - if (!credit_returned) { - wlfc->FIFO_credit[fifo_id]++; - } - } - } - else { - /* - if this packet did not count against FIFO credit, it must have - taken a requested_credit from the destination entry (for pspoll etc.) - */ - if (!entry) { - - entry = _dhd_wlfc_find_table_entry(wlfc, pktbuf); - } - if (!DHD_PKTTAG_ONETIMEPKTRQST(PKTTAG(pktbuf))) - entry->requested_credit++; -#ifdef PROP_TXSTATUS_DEBUG - entry->dstncredit_acks++; -#endif - } - if ((status_flag == WLFC_CTL_PKTFLAG_D11SUPPRESS) || - (status_flag == WLFC_CTL_PKTFLAG_WLSUPPRESS)) { - - ret = _dhd_wlfc_enque_suppressed(wlfc, fifo_id, pktbuf); - if (ret != BCME_OK) { - /* delay q is full, drop this packet */ - dhd_wlfc_hanger_poppkt(wlfc->hanger, WLFC_PKTID_HSLOT_GET(status), - &pktbuf, 1); - - /* indicate failure and free the packet */ - dhd_txcomplete(dhd, pktbuf, FALSE); - entry->transit_count--; - /* packet is transmitted Successfully by dongle after first suppress. */ - if (entry->suppressed) { - entry->suppr_transit_count--; - } - PKTFREE(wlfc->osh, pktbuf, TRUE); - } else { - /* Mark suppressed to avoid a double free during wlfc cleanup */ - - dhd_wlfc_hanger_mark_suppressed(wlfc->hanger, - WLFC_PKTID_HSLOT_GET(status), WLFC_PKTID_GEN(status)); - entry->suppress_count++; - } - } - else { - dhd_txcomplete(dhd, pktbuf, TRUE); - entry->transit_count--; - - /* This packet is transmitted Successfully by dongle even after first suppress. */ - if (entry->suppressed) { - entry->suppr_transit_count--; - } - /* free the packet */ - PKTFREE(wlfc->osh, pktbuf, TRUE); - } - return BCME_OK; -} - -static int -dhd_wlfc_fifocreditback_indicate(dhd_pub_t *dhd, uint8* credits) -{ - int i; - athost_wl_status_info_t* wlfc = (athost_wl_status_info_t*) - dhd->wlfc_state; - for (i = 0; i < WLFC_CTL_VALUE_LEN_FIFO_CREDITBACK; i++) { -#ifdef PROP_TXSTATUS_DEBUG - wlfc->stats.fifo_credits_back[i] += credits[i]; -#endif - /* update FIFO credits */ - if (wlfc->proptxstatus_mode == WLFC_FCMODE_EXPLICIT_CREDIT) - { - int lender; /* Note that borrower is i */ - - /* Return credits to highest priority lender first */ - for (lender = AC_COUNT; (lender >= 0) && (credits[i] > 0); lender--) { - if (wlfc->credits_borrowed[i][lender] > 0) { - if (credits[i] >= wlfc->credits_borrowed[i][lender]) { - credits[i] -= wlfc->credits_borrowed[i][lender]; - wlfc->FIFO_credit[lender] += - wlfc->credits_borrowed[i][lender]; - wlfc->credits_borrowed[i][lender] = 0; - } - else { - wlfc->credits_borrowed[i][lender] -= credits[i]; - wlfc->FIFO_credit[lender] += credits[i]; - credits[i] = 0; - } - } - } - - /* If we have more credits left over, these must belong to the AC */ - if (credits[i] > 0) { - wlfc->FIFO_credit[i] += credits[i]; - } - } - } - - return BCME_OK; -} - -static int -dhd_wlfc_dbg_senum_check(dhd_pub_t *dhd, uint8 *value) -{ - uint32 timestamp; - - (void)dhd; - - bcopy(&value[2], ×tamp, sizeof(uint32)); - DHD_INFO(("RXPKT: SEQ: %d, timestamp %d\n", value[1], timestamp)); - return BCME_OK; -} - - -static int -dhd_wlfc_rssi_indicate(dhd_pub_t *dhd, uint8* rssi) -{ - (void)dhd; - (void)rssi; - return BCME_OK; -} - -static int -dhd_wlfc_mac_table_update(dhd_pub_t *dhd, uint8* value, uint8 type) -{ - int rc; - athost_wl_status_info_t* wlfc = (athost_wl_status_info_t*) - dhd->wlfc_state; - wlfc_mac_descriptor_t* table; - uint8 existing_index; - uint8 table_index; - uint8 ifid; - uint8* ea; - - WLFC_DBGMESG(("%s(), mac [%02x:%02x:%02x:%02x:%02x:%02x],%s,idx:%d,id:0x%02x\n", - __FUNCTION__, value[2], value[3], value[4], value[5], value[6], value[7], - ((type == WLFC_CTL_TYPE_MACDESC_ADD) ? "ADD":"DEL"), - WLFC_MAC_DESC_GET_LOOKUP_INDEX(value[0]), value[0])); - - table = wlfc->destination_entries.nodes; - table_index = WLFC_MAC_DESC_GET_LOOKUP_INDEX(value[0]); - ifid = value[1]; - ea = &value[2]; - - if (type == WLFC_CTL_TYPE_MACDESC_ADD) { - existing_index = dhd_wlfc_find_mac_desc_id_from_mac(dhd, &value[2]); - if (existing_index == WLFC_MAC_DESC_ID_INVALID) { - /* this MAC entry does not exist, create one */ - if (!table[table_index].occupied) { - table[table_index].mac_handle = value[0]; - rc = _dhd_wlfc_mac_entry_update(wlfc, &table[table_index], - eWLFC_MAC_ENTRY_ACTION_ADD, ifid, - wlfc->destination_entries.interfaces[ifid].iftype, - ea); - } - else { - /* the space should have been empty, but it's not */ - wlfc->stats.mac_update_failed++; - } - } - else { - /* - there is an existing entry, move it to new index - if necessary. - */ - if (existing_index != table_index) { - /* if we already have an entry, free the old one */ - table[existing_index].occupied = 0; - table[existing_index].state = WLFC_STATE_CLOSE; - table[existing_index].requested_credit = 0; - table[existing_index].interface_id = 0; - /* enable after packets are queued-deqeued properly. - pktq_flush(dhd->osh, &table[existing_index].psq, FALSE, NULL, 0); - */ - } - } - } - if (type == WLFC_CTL_TYPE_MACDESC_DEL) { - if (table[table_index].occupied) { - rc = _dhd_wlfc_mac_entry_update(wlfc, &table[table_index], - eWLFC_MAC_ENTRY_ACTION_DEL, ifid, - wlfc->destination_entries.interfaces[ifid].iftype, - ea); - } - else { - /* the space should have been occupied, but it's not */ - wlfc->stats.mac_update_failed++; - } - } - BCM_REFERENCE(rc); - return BCME_OK; -} - -static int -dhd_wlfc_psmode_update(dhd_pub_t *dhd, uint8* value, uint8 type) -{ - /* Handle PS on/off indication */ - athost_wl_status_info_t* wlfc = (athost_wl_status_info_t*) - dhd->wlfc_state; - wlfc_mac_descriptor_t* table; - wlfc_mac_descriptor_t* desc; - uint8 mac_handle = value[0]; - int i; - - table = wlfc->destination_entries.nodes; - desc = &table[WLFC_MAC_DESC_GET_LOOKUP_INDEX(mac_handle)]; - if (desc->occupied) { - /* a fresh PS mode should wipe old ps credits? */ - desc->requested_credit = 0; - if (type == WLFC_CTL_TYPE_MAC_OPEN) { - desc->state = WLFC_STATE_OPEN; - DHD_WLFC_CTRINC_MAC_OPEN(desc); - } - else { - desc->state = WLFC_STATE_CLOSE; - DHD_WLFC_CTRINC_MAC_CLOSE(desc); - /* - Indicate to firmware if there is any traffic pending. - */ - for (i = AC_BE; i < AC_COUNT; i++) { - _dhd_wlfc_traffic_pending_check(wlfc, desc, i); - } - } - } - else { - wlfc->stats.psmode_update_failed++; - } - return BCME_OK; -} - -static int -dhd_wlfc_interface_update(dhd_pub_t *dhd, uint8* value, uint8 type) -{ - /* Handle PS on/off indication */ - athost_wl_status_info_t* wlfc = (athost_wl_status_info_t*) - dhd->wlfc_state; - wlfc_mac_descriptor_t* table; - uint8 if_id = value[0]; - - if (if_id < WLFC_MAX_IFNUM) { - table = wlfc->destination_entries.interfaces; - if (table[if_id].occupied) { - if (type == WLFC_CTL_TYPE_INTERFACE_OPEN) { - table[if_id].state = WLFC_STATE_OPEN; - /* WLFC_DBGMESG(("INTERFACE[%d] OPEN\n", if_id)); */ - } - else { - table[if_id].state = WLFC_STATE_CLOSE; - /* WLFC_DBGMESG(("INTERFACE[%d] CLOSE\n", if_id)); */ - } - return BCME_OK; - } - } - wlfc->stats.interface_update_failed++; - - return BCME_OK; -} - -static int -dhd_wlfc_credit_request(dhd_pub_t *dhd, uint8* value) -{ - athost_wl_status_info_t* wlfc = (athost_wl_status_info_t*) - dhd->wlfc_state; - wlfc_mac_descriptor_t* table; - wlfc_mac_descriptor_t* desc; - uint8 mac_handle; - uint8 credit; - - table = wlfc->destination_entries.nodes; - mac_handle = value[1]; - credit = value[0]; - - desc = &table[WLFC_MAC_DESC_GET_LOOKUP_INDEX(mac_handle)]; - if (desc->occupied) { - desc->requested_credit = credit; - - desc->ac_bitmap = value[2]; - } - else { - wlfc->stats.credit_request_failed++; - } - return BCME_OK; -} - -static int -dhd_wlfc_packet_request(dhd_pub_t *dhd, uint8* value) -{ - athost_wl_status_info_t* wlfc = (athost_wl_status_info_t*) - dhd->wlfc_state; - wlfc_mac_descriptor_t* table; - wlfc_mac_descriptor_t* desc; - uint8 mac_handle; - uint8 packet_count; - - table = wlfc->destination_entries.nodes; - mac_handle = value[1]; - packet_count = value[0]; - - desc = &table[WLFC_MAC_DESC_GET_LOOKUP_INDEX(mac_handle)]; - if (desc->occupied) { - desc->requested_packet = packet_count; - - desc->ac_bitmap = value[2]; - } - else { - wlfc->stats.packet_request_failed++; - } - return BCME_OK; -} - -static void -dhd_wlfc_reorderinfo_indicate(uint8 *val, uint8 len, uchar *info_buf, uint *info_len) -{ - if (info_len) { - if (info_buf) { - bcopy(val, info_buf, len); - *info_len = len; - } - else - *info_len = 0; - } -} - -static int -dhd_wlfc_parse_header_info(dhd_pub_t *dhd, void* pktbuf, int tlv_hdr_len, uchar *reorder_info_buf, - uint *reorder_info_len) -{ - uint8 type, len; - uint8* value; - uint8* tmpbuf; - uint16 remainder = tlv_hdr_len; - uint16 processed = 0; - athost_wl_status_info_t* wlfc = (athost_wl_status_info_t*) - dhd->wlfc_state; - tmpbuf = (uint8*)PKTDATA(dhd->osh, pktbuf); - if (remainder) { - while ((processed < (WLFC_MAX_PENDING_DATALEN * 2)) && (remainder > 0)) { - type = tmpbuf[processed]; - if (type == WLFC_CTL_TYPE_FILLER) { - remainder -= 1; - processed += 1; - continue; - } - - len = tmpbuf[processed + 1]; - value = &tmpbuf[processed + 2]; - - if (remainder < (2 + len)) - break; - - remainder -= 2 + len; - processed += 2 + len; - if (type == WLFC_CTL_TYPE_TXSTATUS) - dhd_wlfc_txstatus_update(dhd, value); - if (type == WLFC_CTL_TYPE_COMP_TXSTATUS) - dhd_wlfc_compressed_txstatus_update(dhd, value, len); - - else if (type == WLFC_CTL_TYPE_HOST_REORDER_RXPKTS) - dhd_wlfc_reorderinfo_indicate(value, len, reorder_info_buf, - reorder_info_len); - else if (type == WLFC_CTL_TYPE_FIFO_CREDITBACK) - dhd_wlfc_fifocreditback_indicate(dhd, value); - - else if (type == WLFC_CTL_TYPE_RSSI) - dhd_wlfc_rssi_indicate(dhd, value); - - else if (type == WLFC_CTL_TYPE_MAC_REQUEST_CREDIT) - dhd_wlfc_credit_request(dhd, value); - - else if (type == WLFC_CTL_TYPE_MAC_REQUEST_PACKET) - dhd_wlfc_packet_request(dhd, value); - - else if ((type == WLFC_CTL_TYPE_MAC_OPEN) || - (type == WLFC_CTL_TYPE_MAC_CLOSE)) - dhd_wlfc_psmode_update(dhd, value, type); - - else if ((type == WLFC_CTL_TYPE_MACDESC_ADD) || - (type == WLFC_CTL_TYPE_MACDESC_DEL)) - dhd_wlfc_mac_table_update(dhd, value, type); - - else if (type == WLFC_CTL_TYPE_TRANS_ID) - dhd_wlfc_dbg_senum_check(dhd, value); - - else if ((type == WLFC_CTL_TYPE_INTERFACE_OPEN) || - (type == WLFC_CTL_TYPE_INTERFACE_CLOSE)) { - dhd_wlfc_interface_update(dhd, value, type); - } - } - if (remainder != 0) { - /* trouble..., something is not right */ - wlfc->stats.tlv_parse_failed++; - } - } - return BCME_OK; -} - -int -dhd_wlfc_init(dhd_pub_t *dhd) -{ - char iovbuf[12]; /* Room for "tlv" + '\0' + parameter */ - /* enable all signals & indicate host proptxstatus logic is active */ - uint32 tlv = dhd->wlfc_enabled? - WLFC_FLAGS_RSSI_SIGNALS | - WLFC_FLAGS_XONXOFF_SIGNALS | - WLFC_FLAGS_CREDIT_STATUS_SIGNALS | - WLFC_FLAGS_HOST_PROPTXSTATUS_ACTIVE | - WLFC_FLAGS_HOST_RXRERODER_ACTIVE : 0; - /* WLFC_FLAGS_HOST_PROPTXSTATUS_ACTIVE | WLFC_FLAGS_HOST_RXRERODER_ACTIVE : 0; */ - - - /* - try to enable/disable signaling by sending "tlv" iovar. if that fails, - fallback to no flow control? Print a message for now. - */ - - /* enable proptxtstatus signaling by default */ - bcm_mkiovar("tlv", (char *)&tlv, 4, iovbuf, sizeof(iovbuf)); - if (dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0) < 0) { - DHD_ERROR(("dhd_wlfc_init(): failed to enable/disable bdcv2 tlv signaling\n")); - } - else { - /* - Leaving the message for now, it should be removed after a while; once - the tlv situation is stable. - */ - DHD_ERROR(("dhd_wlfc_init(): successfully %s bdcv2 tlv signaling, %d\n", - dhd->wlfc_enabled?"enabled":"disabled", tlv)); - } - return BCME_OK; -} - -int -dhd_wlfc_enable(dhd_pub_t *dhd) -{ - int i; - athost_wl_status_info_t* wlfc; - - if (!dhd->wlfc_enabled || dhd->wlfc_state) - return BCME_OK; - - /* allocate space to track txstatus propagated from firmware */ - dhd->wlfc_state = MALLOC(dhd->osh, sizeof(athost_wl_status_info_t)); - if (dhd->wlfc_state == NULL) - { - DHD_ERROR(("Failed to malloc dhd->wlfc_state\n")); - return BCME_NOMEM; - } - - /* initialize state space */ - wlfc = (athost_wl_status_info_t*)dhd->wlfc_state; - memset(wlfc, 0, sizeof(athost_wl_status_info_t)); - - /* remember osh & dhdp */ - wlfc->osh = dhd->osh; - wlfc->dhdp = dhd; - - wlfc->hanger = - dhd_wlfc_hanger_create(dhd->osh, WLFC_HANGER_MAXITEMS); - if (wlfc->hanger == NULL) { - MFREE(dhd->osh, dhd->wlfc_state, sizeof(athost_wl_status_info_t)); - dhd->wlfc_state = NULL; - return BCME_NOMEM; - } - - /* initialize all interfaces to accept traffic */ - for (i = 0; i < WLFC_MAX_IFNUM; i++) { - wlfc->hostif_flow_state[i] = OFF; - } - - wlfc->destination_entries.other.state = WLFC_STATE_OPEN; - /* bc/mc FIFO is always open [credit aside], i.e. b[5] */ - wlfc->destination_entries.other.ac_bitmap = 0x1f; - wlfc->destination_entries.other.interface_id = 0; - - wlfc->proptxstatus_mode = WLFC_FCMODE_EXPLICIT_CREDIT; - - wlfc->allow_credit_borrow = TRUE; - wlfc->borrow_defer_timestamp = 0; -#if defined(CUSTOMER_HW4) && defined(USE_DYNAMIC_F2_BLKSIZE) - dhdsdio_func_blocksize(dhd, 2, DYNAMIC_F2_BLKSIZE_FOR_NONLEGACY); -#endif /* CUSTOMER_HW4 && USE_DYNAMIC_F2_BLKSIZE */ - return BCME_OK; -} - -/* release all packet resources */ -void -dhd_wlfc_cleanup(dhd_pub_t *dhd, ifpkt_cb_t fn, int arg) -{ - int i; - int total_entries; - athost_wl_status_info_t* wlfc = (athost_wl_status_info_t*) - dhd->wlfc_state; - wlfc_mac_descriptor_t* table; - wlfc_hanger_t* h; - int prec; - void *pkt = NULL; - struct pktq *txq = NULL; - if (dhd->wlfc_state == NULL) - return; - /* flush bus->txq */ - txq = dhd_bus_txq(dhd->bus); - /* any in the hanger? */ - h = (wlfc_hanger_t*)wlfc->hanger; - total_entries = sizeof(wlfc->destination_entries)/sizeof(wlfc_mac_descriptor_t); - /* search all entries, include nodes as well as interfaces */ - table = (wlfc_mac_descriptor_t*)&wlfc->destination_entries; - - for (i = 0; i < total_entries; i++) { - if (table[i].occupied && (fn == NULL || (arg == table[i].interface_id))) { - if (table[i].psq.len) { - WLFC_DBGMESG(("%s(): DELAYQ[%d].len = %d\n", - __FUNCTION__, i, table[i].psq.len)); - /* release packets held in DELAYQ */ - pktq_flush(wlfc->osh, &table[i].psq, TRUE, fn, arg); - } - if (fn == NULL) - table[i].occupied = 0; - } - } - for (prec = 0; prec < txq->num_prec; prec++) { - pkt = pktq_pdeq_with_fn(txq, prec, fn, arg); - while (pkt) { - for (i = 0; i < h->max_items; i++) { - if (pkt == h->items[i].pkt) { - if (h->items[i].state == WLFC_HANGER_ITEM_STATE_INUSE) { - PKTFREE(wlfc->osh, h->items[i].pkt, TRUE); - h->items[i].state = WLFC_HANGER_ITEM_STATE_FREE; - } else if (h->items[i].state == - WLFC_HANGER_ITEM_STATE_INUSE_SUPPRESSED) { - /* These are already freed from the psq */ - h->items[i].state = WLFC_HANGER_ITEM_STATE_FREE; - } - break; - } - } - pkt = pktq_pdeq(txq, prec); - } - } - /* flush remained pkt in hanger queue, not in bus->txq */ - for (i = 0; i < h->max_items; i++) { - if (h->items[i].state == WLFC_HANGER_ITEM_STATE_INUSE) { - if (fn == NULL || (*fn)(h->items[i].pkt, arg)) { - PKTFREE(wlfc->osh, h->items[i].pkt, TRUE); - h->items[i].state = WLFC_HANGER_ITEM_STATE_FREE; - } - } else if (h->items[i].state == WLFC_HANGER_ITEM_STATE_INUSE_SUPPRESSED) { - if (fn == NULL || (*fn)(h->items[i].pkt, arg)) { - /* These are freed from the psq so no need to free again */ - h->items[i].state = WLFC_HANGER_ITEM_STATE_FREE; - } - } - } - return; -} - -void -dhd_wlfc_deinit(dhd_pub_t *dhd) -{ - /* cleanup all psq related resources */ - athost_wl_status_info_t* wlfc = (athost_wl_status_info_t*) - dhd->wlfc_state; - - dhd_os_wlfc_block(dhd); - if (dhd->wlfc_state == NULL) { - dhd_os_wlfc_unblock(dhd); - return; - } - -#ifdef PROP_TXSTATUS_DEBUG - { - int i; - wlfc_hanger_t* h = (wlfc_hanger_t*)wlfc->hanger; - for (i = 0; i < h->max_items; i++) { - if (h->items[i].state != WLFC_HANGER_ITEM_STATE_FREE) { - WLFC_DBGMESG(("%s() pkt[%d] = 0x%p, FIFO_credit_used:%d\n", - __FUNCTION__, i, h->items[i].pkt, - DHD_PKTTAG_CREDITCHECK(PKTTAG(h->items[i].pkt)))); - } - } - } -#endif - /* delete hanger */ - dhd_wlfc_hanger_delete(dhd->osh, wlfc->hanger); - - /* free top structure */ - MFREE(dhd->osh, dhd->wlfc_state, sizeof(athost_wl_status_info_t)); - dhd->wlfc_state = NULL; - dhd_os_wlfc_unblock(dhd); -#if defined(CUSTOMER_HW4) && defined(USE_DYNAMIC_F2_BLKSIZE) - dhdsdio_func_blocksize(dhd, 2, sd_f2_blocksize); -#endif /* CUSTOMER_HW4 && USE_DYNAMIC_F2_BLKSIZE */ - return; -} -#endif /* PROP_TXSTATUS */ - -void -dhd_prot_dump(dhd_pub_t *dhdp, struct bcmstrbuf *strbuf) -{ - bcm_bprintf(strbuf, "Protocol CDC: reqid %d\n", dhdp->prot->reqid); -#ifdef PROP_TXSTATUS - if (dhdp->wlfc_state) - dhd_wlfc_dump(dhdp, strbuf); -#endif -} - -/* The FreeBSD PKTPUSH could change the packet buf pinter - so we need to make it changable -*/ -#define PKTBUF pktbuf -void -dhd_prot_hdrpush(dhd_pub_t *dhd, int ifidx, void *PKTBUF) -{ -#ifdef BDC - struct bdc_header *h; -#endif /* BDC */ - - DHD_TRACE(("%s: Enter\n", __FUNCTION__)); - -#ifdef BDC - /* Push BDC header used to convey priority for buses that don't */ - - PKTPUSH(dhd->osh, PKTBUF, BDC_HEADER_LEN); - - h = (struct bdc_header *)PKTDATA(dhd->osh, PKTBUF); - - h->flags = (BDC_PROTO_VER << BDC_FLAG_VER_SHIFT); - if (PKTSUMNEEDED(PKTBUF)) - h->flags |= BDC_FLAG_SUM_NEEDED; - - - h->priority = (PKTPRIO(PKTBUF) & BDC_PRIORITY_MASK); - h->flags2 = 0; - h->dataOffset = 0; -#endif /* BDC */ - BDC_SET_IF_IDX(h, ifidx); -} -#undef PKTBUF /* Only defined in the above routine */ - -int -dhd_prot_hdrpull(dhd_pub_t *dhd, int *ifidx, void *pktbuf, uchar *reorder_buf_info, - uint *reorder_info_len) -{ -#ifdef BDC - struct bdc_header *h; -#endif - uint8 data_offset = 0; - - DHD_TRACE(("%s: Enter\n", __FUNCTION__)); - -#ifdef BDC - if (reorder_info_len) - *reorder_info_len = 0; - /* Pop BDC header used to convey priority for buses that don't */ - - if (PKTLEN(dhd->osh, pktbuf) < BDC_HEADER_LEN) { - DHD_ERROR(("%s: rx data too short (%d < %d)\n", __FUNCTION__, - PKTLEN(dhd->osh, pktbuf), BDC_HEADER_LEN)); - return BCME_ERROR; - } - - h = (struct bdc_header *)PKTDATA(dhd->osh, pktbuf); - -#if defined(NDIS630) - h->dataOffset = 0; -#endif - - if (!ifidx) { - /* for tx packet, skip the analysis */ - data_offset = h->dataOffset; - PKTPULL(dhd->osh, pktbuf, BDC_HEADER_LEN); - goto exit; - } - - if ((*ifidx = BDC_GET_IF_IDX(h)) >= DHD_MAX_IFS) { - DHD_ERROR(("%s: rx data ifnum out of range (%d)\n", - __FUNCTION__, *ifidx)); - return BCME_ERROR; - } - - if (((h->flags & BDC_FLAG_VER_MASK) >> BDC_FLAG_VER_SHIFT) != BDC_PROTO_VER) { - DHD_ERROR(("%s: non-BDC packet received, flags = 0x%x\n", - dhd_ifname(dhd, *ifidx), h->flags)); - if (((h->flags & BDC_FLAG_VER_MASK) >> BDC_FLAG_VER_SHIFT) == BDC_PROTO_VER_1) - h->dataOffset = 0; - else - return BCME_ERROR; - } - - if (h->flags & BDC_FLAG_SUM_GOOD) { - DHD_INFO(("%s: BDC packet received with good rx-csum, flags 0x%x\n", - dhd_ifname(dhd, *ifidx), h->flags)); - PKTSETSUMGOOD(pktbuf, TRUE); - } - - PKTSETPRIO(pktbuf, (h->priority & BDC_PRIORITY_MASK)); - data_offset = h->dataOffset; - PKTPULL(dhd->osh, pktbuf, BDC_HEADER_LEN); -#endif /* BDC */ - -#if !defined(NDIS630) - if (PKTLEN(dhd->osh, pktbuf) < (uint32) (data_offset << 2)) { - DHD_ERROR(("%s: rx data too short (%d < %d)\n", __FUNCTION__, - PKTLEN(dhd->osh, pktbuf), (data_offset * 4))); - return BCME_ERROR; - } -#endif -#ifdef PROP_TXSTATUS - dhd_os_wlfc_block(dhd); - if (dhd->wlfc_state && - ((athost_wl_status_info_t*)dhd->wlfc_state)->proptxstatus_mode - != WLFC_FCMODE_NONE && - (!DHD_PKTTAG_PKTDIR(PKTTAG(pktbuf)))) { - /* - - parse txstatus only for packets that came from the firmware - */ - dhd_wlfc_parse_header_info(dhd, pktbuf, (data_offset << 2), - reorder_buf_info, reorder_info_len); - ((athost_wl_status_info_t*)dhd->wlfc_state)->stats.dhd_hdrpulls++; - } - dhd_os_wlfc_unblock(dhd); -#endif /* PROP_TXSTATUS */ - -exit: -#if !defined(NDIS630) - PKTPULL(dhd->osh, pktbuf, (data_offset << 2)); -#endif - return 0; -} - -#if defined(PROP_TXSTATUS) -void -dhd_wlfc_trigger_pktcommit(dhd_pub_t *dhd) -{ - dhd_os_wlfc_block(dhd); - if (dhd->wlfc_state && - (((athost_wl_status_info_t*)dhd->wlfc_state)->proptxstatus_mode - != WLFC_FCMODE_NONE)) { - dhd_wlfc_commit_packets(dhd->wlfc_state, (f_commitpkt_t)dhd_bus_txdata, - (void *)dhd->bus, NULL); - } - dhd_os_wlfc_unblock(dhd); -} -#endif - - -int -dhd_prot_attach(dhd_pub_t *dhd) -{ - dhd_prot_t *cdc; - - if (!(cdc = (dhd_prot_t *)DHD_OS_PREALLOC(dhd->osh, DHD_PREALLOC_PROT, - sizeof(dhd_prot_t)))) { - DHD_ERROR(("%s: kmalloc failed\n", __FUNCTION__)); - goto fail; + if (!(cdc = (dhd_prot_t *)DHD_OS_PREALLOC(dhd->osh, DHD_PREALLOC_PROT, + sizeof(dhd_prot_t)))) { + DHD_ERROR(("%s: kmalloc failed\n", __FUNCTION__)); + goto fail; } memset(cdc, 0, sizeof(dhd_prot_t)); @@ -2869,6 +552,8 @@ dhd_prot_detach(dhd_pub_t *dhd) { #ifdef PROP_TXSTATUS dhd_wlfc_deinit(dhd); + if (dhd->plat_deinit) + dhd->plat_deinit((void *)dhd); #endif #ifndef CONFIG_DHD_USE_STATIC_BUF MFREE(dhd->osh, dhd->prot, sizeof(dhd_prot_t)); @@ -2904,15 +589,7 @@ dhd_prot_init(dhd_pub_t *dhd) goto done; -#if defined(WL_CFG80211) - if (dhd_download_fw_on_driverload) -#endif /* defined(WL_CFG80211) */ - ret = dhd_preinit_ioctls(dhd); - -#ifdef PROP_TXSTATUS - ret = dhd_wlfc_init(dhd); -#endif - + ret = dhd_preinit_ioctls(dhd); /* Always assumes wl for now */ dhd->iswl = TRUE; diff --git a/drivers/net/wireless/bcmdhd/dhd_cfg80211.c b/drivers/net/wireless/bcmdhd/dhd_cfg80211.c index f053a7ed19d..e4984c6a6e3 100644 --- a/drivers/net/wireless/bcmdhd/dhd_cfg80211.c +++ b/drivers/net/wireless/bcmdhd/dhd_cfg80211.c @@ -1,7 +1,7 @@ /* * Linux cfg80211 driver - Dongle Host Driver (DHD) related * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -286,7 +286,8 @@ static bool btcoex_is_sco_active(struct net_device *dev) } if (sco_id_cnt > 2) { - WL_TRACE(("sco/esco detected, pkt id_cnt:%d samples:%d\n", sco_id_cnt, i)); + WL_TRACE(("sco/esco detected, pkt id_cnt:%d samples:%d\n", + sco_id_cnt, i)); res = TRUE; break; } @@ -455,6 +456,7 @@ static void wl_cfg80211_bt_handler(struct work_struct *work) * provide OPPORTUNITY window to get DHCP address */ WL_TRACE(("bt_dhcp stm: started \n")); + btcx_inf->bt_state = BT_DHCP_OPPR_WIN; mod_timer(&btcx_inf->timer, jiffies + msecs_to_jiffies(BT_DHCP_OPPR_WIN_TIME)); @@ -497,7 +499,7 @@ static void wl_cfg80211_bt_handler(struct work_struct *work) break; default: - WL_ERR(("error g_status=%d !!!\n", btcx_inf->bt_state)); + WL_ERR(("error g_status=%d !!!\n", btcx_inf->bt_state)); if (btcx_inf->dev) wl_cfg80211_bt_setflag(btcx_inf->dev, FALSE); btcx_inf->bt_state = BT_DHCP_IDLE; @@ -579,6 +581,7 @@ int wl_cfg80211_set_btcoex_dhcp(struct net_device *dev, char *command) if (strnicmp((char *)&powermode_val, "1", strlen("1")) == 0) { WL_TRACE_HW4(("DHCP session starts\n")); + #ifdef PKT_FILTER_SUPPORT dhd->dhcp_in_progress = 1; @@ -631,6 +634,7 @@ int wl_cfg80211_set_btcoex_dhcp(struct net_device *dev, char *command) else if (strnicmp((char *)&powermode_val, "2", strlen("2")) == 0) { + #ifdef PKT_FILTER_SUPPORT dhd->dhcp_in_progress = 0; WL_TRACE_HW4(("DHCP is complete \n")); @@ -640,7 +644,7 @@ int wl_cfg80211_set_btcoex_dhcp(struct net_device *dev, char *command) WL_TRACE_HW4(("DHCP is complete , enable packet filter!!!\n")); dhd_enable_packet_filter(1, dhd); } -#endif +#endif /* PKT_FILTER_SUPPORT */ /* Restoring PM mode */ diff --git a/drivers/net/wireless/bcmdhd/dhd_cfg80211.h b/drivers/net/wireless/bcmdhd/dhd_cfg80211.h index 985d9d25b0c..c5c8c215f99 100644 --- a/drivers/net/wireless/bcmdhd/dhd_cfg80211.h +++ b/drivers/net/wireless/bcmdhd/dhd_cfg80211.h @@ -1,7 +1,7 @@ /* * Linux cfg80211 driver - Dongle Host Driver (DHD) related * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd/dhd_common.c b/drivers/net/wireless/bcmdhd/dhd_common.c index 14061bd5863..90ff3502c67 100644 --- a/drivers/net/wireless/bcmdhd/dhd_common.c +++ b/drivers/net/wireless/bcmdhd/dhd_common.c @@ -1,7 +1,7 @@ /* * Broadcom Dongle Host Driver (DHD), common DHD core. * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -21,7 +21,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: dhd_common.c 412802 2013-07-16 16:06:51Z $ + * $Id: dhd_common.c 439201 2013-11-26 00:31:53Z $ */ #include #include @@ -33,8 +33,10 @@ #include #include #include +#include #include +#include #include #include @@ -48,6 +50,9 @@ #include #include #endif +#ifdef PNO_SUPPORT +#include +#endif #ifdef SET_RANDOM_MAC_SOFTAP #include #include @@ -65,7 +70,6 @@ #include #endif - #ifdef WLMEDIA_HTSF extern void htsf_update(struct dhd_info *dhd, void *data); #endif @@ -134,7 +138,8 @@ enum { #ifdef PROP_TXSTATUS IOV_PROPTXSTATUS_ENABLE, IOV_PROPTXSTATUS_MODE, -#endif + IOV_PROPTXSTATUS_OPT, +#endif /* PROP_TXSTATUS */ IOV_BUS_TYPE, #ifdef WLMEDIA_HTSF IOV_WLPKTDLYSTAT_SZ, @@ -173,7 +178,8 @@ const bcm_iovar_t dhd_iovars[] = { 2 - Use explicit credit */ {"ptxmode", IOV_PROPTXSTATUS_MODE, 0, IOVT_UINT32, 0 }, -#endif + {"proptx_opt", IOV_PROPTXSTATUS_OPT, 0, IOVT_UINT32, 0 }, +#endif /* PROP_TXSTATUS */ {"bustype", IOV_BUS_TYPE, 0, IOVT_UINT32, 0}, #ifdef WLMEDIA_HTSF {"pktdlystatsz", IOV_WLPKTDLYSTAT_SZ, 0, IOVT_UINT8, 0 }, @@ -183,6 +189,7 @@ const bcm_iovar_t dhd_iovars[] = { (WLHOST_REORDERDATA_MAXFLOWS + 1) }, {NULL, 0, 0, 0, 0 } }; +#define DHD_IOVAR_BUF_SIZE 128 void dhd_common_init(osl_t *osh) @@ -202,6 +209,28 @@ dhd_common_init(osl_t *osh) #endif } +void +dhd_common_deinit(dhd_pub_t *dhd_pub, dhd_cmn_t *sa_cmn) +{ + osl_t *osh; + dhd_cmn_t *cmn; + + if (dhd_pub != NULL) + cmn = dhd_pub->cmn; + else + cmn = sa_cmn; + + if (!cmn) + return; + + osh = cmn->osh; + + if (dhd_pub != NULL) + dhd_pub->cmn = NULL; + + MFREE(osh, cmn, sizeof(dhd_cmn_t)); +} + static int dhd_dump(dhd_pub_t *dhdp, char *buf, int buflen) { @@ -217,31 +246,31 @@ dhd_dump(dhd_pub_t *dhdp, char *buf, int buflen) bcm_bprintf(strbuf, "\n"); bcm_bprintf(strbuf, "pub.up %d pub.txoff %d pub.busstate %d\n", dhdp->up, dhdp->txoff, dhdp->busstate); - bcm_bprintf(strbuf, "pub.hdrlen %d pub.maxctl %d pub.rxsz %d\n", + bcm_bprintf(strbuf, "pub.hdrlen %u pub.maxctl %u pub.rxsz %u\n", dhdp->hdrlen, dhdp->maxctl, dhdp->rxsz); bcm_bprintf(strbuf, "pub.iswl %d pub.drv_version %ld pub.mac %s\n", dhdp->iswl, dhdp->drv_version, bcm_ether_ntoa(&dhdp->mac, eabuf)); - bcm_bprintf(strbuf, "pub.bcmerror %d tickcnt %d\n", dhdp->bcmerror, dhdp->tickcnt); + bcm_bprintf(strbuf, "pub.bcmerror %d tickcnt %u\n", dhdp->bcmerror, dhdp->tickcnt); bcm_bprintf(strbuf, "dongle stats:\n"); - bcm_bprintf(strbuf, "tx_packets %ld tx_bytes %ld tx_errors %ld tx_dropped %ld\n", + bcm_bprintf(strbuf, "tx_packets %lu tx_bytes %lu tx_errors %lu tx_dropped %lu\n", dhdp->dstats.tx_packets, dhdp->dstats.tx_bytes, dhdp->dstats.tx_errors, dhdp->dstats.tx_dropped); - bcm_bprintf(strbuf, "rx_packets %ld rx_bytes %ld rx_errors %ld rx_dropped %ld\n", + bcm_bprintf(strbuf, "rx_packets %lu rx_bytes %lu rx_errors %lu rx_dropped %lu\n", dhdp->dstats.rx_packets, dhdp->dstats.rx_bytes, dhdp->dstats.rx_errors, dhdp->dstats.rx_dropped); - bcm_bprintf(strbuf, "multicast %ld\n", dhdp->dstats.multicast); + bcm_bprintf(strbuf, "multicast %lu\n", dhdp->dstats.multicast); bcm_bprintf(strbuf, "bus stats:\n"); - bcm_bprintf(strbuf, "tx_packets %ld tx_multicast %ld tx_errors %ld\n", + bcm_bprintf(strbuf, "tx_packets %lu tx_multicast %lu tx_errors %lu\n", dhdp->tx_packets, dhdp->tx_multicast, dhdp->tx_errors); - bcm_bprintf(strbuf, "tx_ctlpkts %ld tx_ctlerrs %ld\n", + bcm_bprintf(strbuf, "tx_ctlpkts %lu tx_ctlerrs %lu\n", dhdp->tx_ctlpkts, dhdp->tx_ctlerrs); - bcm_bprintf(strbuf, "rx_packets %ld rx_multicast %ld rx_errors %ld \n", + bcm_bprintf(strbuf, "rx_packets %lu rx_multicast %lu rx_errors %lu \n", dhdp->rx_packets, dhdp->rx_multicast, dhdp->rx_errors); - bcm_bprintf(strbuf, "rx_ctlpkts %ld rx_ctlerrs %ld rx_dropped %ld\n", + bcm_bprintf(strbuf, "rx_ctlpkts %lu rx_ctlerrs %lu rx_dropped %lu\n", dhdp->rx_ctlpkts, dhdp->rx_ctlerrs, dhdp->rx_dropped); - bcm_bprintf(strbuf, "rx_readahead_cnt %ld tx_realloc %ld\n", + bcm_bprintf(strbuf, "rx_readahead_cnt %lu tx_realloc %lu\n", dhdp->rx_readahead_cnt, dhdp->tx_realloc); bcm_bprintf(strbuf, "\n"); @@ -272,11 +301,12 @@ dhd_wl_ioctl_cmd(dhd_pub_t *dhd_pub, int cmd, void *arg, int len, uint8 set, int int dhd_wl_ioctl(dhd_pub_t *dhd_pub, int ifindex, wl_ioctl_t *ioc, void *buf, int len) { - int ret; + int ret = 0; - dhd_os_proto_block(dhd_pub); + if (dhd_os_proto_block(dhd_pub)) + { - ret = dhd_prot_ioctl(dhd_pub, ifindex, ioc, buf, len); + ret = dhd_prot_ioctl(dhd_pub, ifindex, ioc, buf, len); #if defined(CUSTOMER_HW4) if ((ret || ret == -ETIMEDOUT) && (dhd_pub->up)) #else @@ -292,22 +322,23 @@ dhd_wl_ioctl(dhd_pub_t *dhd_pub, int ifindex, wl_ioctl_t *ioc, void *buf, int le dhd_pub->busstate = DHD_BUS_DOWN; } - dhd_os_proto_unblock(dhd_pub); + dhd_os_proto_unblock(dhd_pub); #if defined(CUSTOMER_HW4) - if (ret < 0) { - if (ioc->cmd == WLC_GET_VAR) - DHD_ERROR(("%s: WLC_GET_VAR: %s, ret = %d\n", - __FUNCTION__, (char *)ioc->buf, ret)); - else if (ioc->cmd == WLC_SET_VAR) - DHD_ERROR(("%s: WLC_SET_VAR: %s, ret = %d\n", - __FUNCTION__, (char *)ioc->buf, ret)); - else - DHD_ERROR(("%s: WLC_IOCTL: cmd: %d, ret = %d\n", - __FUNCTION__, ioc->cmd, ret)); - } + if (ret < 0) { + if (ioc->cmd == WLC_GET_VAR) + DHD_ERROR(("%s: WLC_GET_VAR: %s, ret = %d\n", + __FUNCTION__, (char *)ioc->buf, ret)); + else if (ioc->cmd == WLC_SET_VAR) + DHD_ERROR(("%s: WLC_SET_VAR: %s, ret = %d\n", + __FUNCTION__, (char *)ioc->buf, ret)); + else + DHD_ERROR(("%s: WLC_IOCTL: cmd: %d, ret = %d\n", + __FUNCTION__, ioc->cmd, ret)); + } #endif /* OEM_ANDROID && CUSTOMER_HW4 */ + } return ret; } @@ -613,6 +644,89 @@ dhd_prec_enq(dhd_pub_t *dhdp, struct pktq *q, void *pkt, int prec) return TRUE; } +/* + * Functions to drop proper pkts from queue: + * If one pkt in queue is non-fragmented, drop first non-fragmented pkt only + * If all pkts in queue are all fragmented, find and drop one whole set fragmented pkts + * If can't find pkts matching upper 2 cases, drop first pkt anyway + */ +bool +dhd_prec_drop_pkts(osl_t *osh, struct pktq *pq, int prec) +{ + struct pktq_prec *q = NULL; + void *p, *prev = NULL, *next = NULL, *first = NULL, *last = NULL, *prev_first = NULL; + pkt_frag_t frag_info; + + ASSERT(osh && pq); + ASSERT(prec >= 0 && prec < pq->num_prec); + + q = &pq->q[prec]; + p = q->head; + + if (p == NULL) + return FALSE; + + while (p) { + frag_info = pkt_frag_info(osh, p); + if (frag_info == DHD_PKT_FRAG_NONE) { + break; + } else if (frag_info == DHD_PKT_FRAG_FIRST) { + if (first) { + /* No last frag pkt, use prev as last */ + last = prev; + } else { + first = p; + prev_first = prev; + } + } else if (frag_info == DHD_PKT_FRAG_LAST) { + if (first) { + last = p; + break; + } + } + + prev = p; + p = PKTLINK(p); + } + + if ((p == NULL) || ((frag_info != DHD_PKT_FRAG_NONE) && !(first && last))) { + /* Not found matching pkts, use oldest */ + prev = NULL; + p = q->head; + frag_info = 0; + } + + if (frag_info == DHD_PKT_FRAG_NONE) { + first = last = p; + prev_first = prev; + } + + p = first; + while (p) { + next = PKTLINK(p); + q->len--; + pq->len--; + + PKTSETLINK(p, NULL); + + PKTFREE(osh, p, TRUE); + + if (p == last) + break; + + p = next; + } + + if (prev_first == NULL) { + if ((q->head = next) == NULL) + q->tail = NULL; + } else { + PKTSETLINK(prev_first, next); + } + + return TRUE; +} + static int dhd_iovar_op(dhd_pub_t *dhd_pub, const char *name, void *params, int plen, void *arg, int len, bool set) @@ -923,6 +1037,7 @@ wl_show_host_event(wl_event_msg_t *event, void *event_data) case WLC_E_TRACE: { static uint32 seqnum_prev = 0; + static uint32 logtrace_seqnum_prev = 0; msgtrace_hdr_t hdr; uint32 nblost; char *s, *p; @@ -939,35 +1054,72 @@ wl_show_host_event(wl_event_msg_t *event, void *event_data) break; } - /* There are 2 bytes available at the end of data */ - buf[MSGTRACE_HDRLEN + ntoh16(hdr.len)] = '\0'; + if (hdr.trace_type == MSGTRACE_HDR_TYPE_MSG) { + /* There are 2 bytes available at the end of data */ + buf[MSGTRACE_HDRLEN + ntoh16(hdr.len)] = '\0'; - if (ntoh32(hdr.discarded_bytes) || ntoh32(hdr.discarded_printf)) { - printf("\nWLC_E_TRACE: [Discarded traces in dongle -->" - "discarded_bytes %d discarded_printf %d]\n", - ntoh32(hdr.discarded_bytes), ntoh32(hdr.discarded_printf)); - } + if (ntoh32(hdr.discarded_bytes) || ntoh32(hdr.discarded_printf)) { + printf("\nWLC_E_TRACE: [Discarded traces in dongle -->" + "discarded_bytes %d discarded_printf %d]\n", + ntoh32(hdr.discarded_bytes), ntoh32(hdr.discarded_printf)); + } - nblost = ntoh32(hdr.seqnum) - seqnum_prev - 1; - if (nblost > 0) { - printf("\nWLC_E_TRACE: [Event lost --> seqnum %d nblost %d\n", - ntoh32(hdr.seqnum), nblost); - } - seqnum_prev = ntoh32(hdr.seqnum); - - /* Display the trace buffer. Advance from \n to \n to avoid display big - * printf (issue with Linux printk ) - */ - p = (char *)&buf[MSGTRACE_HDRLEN]; - while ((s = strstr(p, "\n")) != NULL) { - *s = '\0'; - printf("%s\n", p); - p = s+1; + nblost = ntoh32(hdr.seqnum) - seqnum_prev - 1; + if (nblost > 0) { + printf("\nWLC_E_TRACE: [Event lost (msg) --> seqnum %d nblost %d\n", + ntoh32(hdr.seqnum), nblost); + } + seqnum_prev = ntoh32(hdr.seqnum); + + /* Display the trace buffer. Advance from \n to \n to avoid display big + * printf (issue with Linux printk ) + */ + p = (char *)&buf[MSGTRACE_HDRLEN]; + while (*p != '\0' && (s = strstr(p, "\n")) != NULL) { + *s = '\0'; + printf("%s\n", p); + p = s+1; + } + if (*p) printf("%s", p); + + /* Reset datalen to avoid display below */ + datalen = 0; + + } else if (hdr.trace_type == MSGTRACE_HDR_TYPE_LOG) { + /* Let the standard event printing work for now */ + uint32 timestamp, w; + if (ntoh32(hdr.seqnum) == logtrace_seqnum_prev) { + printf("\nWLC_E_TRACE: [Event duplicate (log) %d", + logtrace_seqnum_prev); + } else { + nblost = ntoh32(hdr.seqnum) - logtrace_seqnum_prev - 1; + if (nblost > 0) { + printf("\nWLC_E_TRACE: [Event lost (log)" + " --> seqnum %d nblost %d\n", + ntoh32(hdr.seqnum), nblost); + } + logtrace_seqnum_prev = ntoh32(hdr.seqnum); + + p = (char *)&buf[MSGTRACE_HDRLEN]; + datalen -= MSGTRACE_HDRLEN; + w = ntoh32((uint32) *p); + p += 4; + datalen -= 4; + timestamp = ntoh32((uint32) *p); + printf("Logtrace %x timestamp %x %x", + logtrace_seqnum_prev, timestamp, w); + + while (datalen > 4) { + p += 4; + datalen -= 4; + /* Print each word. DO NOT ntoh it. */ + printf(" %8.8x", *((uint32 *) p)); + } + printf("\n"); + } + datalen = 0; } - printf("%s\n", p); - /* Reset datalen to avoid display below */ - datalen = 0; break; } @@ -990,7 +1142,7 @@ wl_show_host_event(wl_event_msg_t *event, void *event_data) } /* show any appended data */ - if (datalen) { + if (DHD_BYTES_ON() && DHD_EVENT_ON() && datalen) { buf = (uchar *) event_data; DHD_EVENT((" data (%d) : ", datalen)); for (i = 0; i < datalen; i++) @@ -1037,8 +1189,10 @@ wl_host_event(dhd_pub_t *dhd_pub, int *ifidx, void *pktdata, switch (type) { #ifdef PROP_TXSTATUS case WLC_E_FIFO_CREDIT_MAP: + dhd_os_wlfc_block(dhd_pub); dhd_wlfc_event(dhd_pub->info); dhd_wlfc_FIFOcreditmap_event(dhd_pub->info, event_data); + dhd_os_wlfc_unblock(dhd_pub); WLFC_DBGMESG(("WLC_E_FIFO_CREDIT_MAP:(AC0,AC1,AC2,AC3),(BC_MC),(OTHER): " "(%d,%d,%d,%d),(%d),(%d)\n", event_data[0], event_data[1], event_data[2], @@ -1049,11 +1203,13 @@ wl_host_event(dhd_pub_t *dhd_pub, int *ifidx, void *pktdata, case WLC_E_IF: { dhd_if_event_t *ifevent = (dhd_if_event_t *)event_data; + /* Ignore the event if NOIF is set */ if (ifevent->flags & WLC_E_IF_FLAGS_BSSCFG_NOIF) { - DHD_ERROR(("WLC_E_IF: NO_IF set, event Ignored\r\n")); + WLFC_DBGMESG(("WLC_E_IF: NO_IF set, event Ignored\r\n")); return (BCME_OK); } + #ifdef PROP_TXSTATUS { uint8* ea = pvt_data->eth.ether_dhost; @@ -1064,6 +1220,8 @@ wl_host_event(dhd_pub_t *dhd_pub, int *ifidx, void *pktdata, ((ifevent->is_AP == 0) ? "STA":"AP "), ea[0], ea[1], ea[2], ea[3], ea[4], ea[5])); (void)ea; + + dhd_os_wlfc_block(dhd_pub); if (ifevent->action == WLC_E_IF_CHANGE) dhd_wlfc_interface_event(dhd_pub->info, eWLFC_MAC_ENTRY_ACTION_UPDATE, @@ -1073,7 +1231,7 @@ wl_host_event(dhd_pub_t *dhd_pub, int *ifidx, void *pktdata, ((ifevent->action == WLC_E_IF_ADD) ? eWLFC_MAC_ENTRY_ACTION_ADD : eWLFC_MAC_ENTRY_ACTION_DEL), ifevent->ifidx, ifevent->is_AP, ea); - + dhd_os_wlfc_unblock(dhd_pub); /* dhd already has created an interface by default, for 0 */ if (ifevent->ifidx == 0) @@ -1127,17 +1285,22 @@ wl_host_event(dhd_pub_t *dhd_pub, int *ifidx, void *pktdata, htsf_update(dhd_pub->info, event_data); break; #endif /* WLMEDIA_HTSF */ -#if defined(NDIS630) - case WLC_E_NDIS_LINK: - break; -#else /* defined(NDIS630) && defined(BCMDONGLEHOST) */ case WLC_E_NDIS_LINK: { uint32 temp = hton32(WLC_E_LINK); memcpy((void *)(&pvt_data->event.event_type), &temp, sizeof(pvt_data->event.event_type)); } -#endif + case WLC_E_PFN_NET_FOUND: + case WLC_E_PFN_NET_LOST: + break; + case WLC_E_PFN_BSSID_NET_FOUND: + case WLC_E_PFN_BSSID_NET_LOST: + case WLC_E_PFN_BEST_BATCHING: +#ifdef PNO_SUPPORT + dhd_pno_event_handler(dhd_pub, event, (void *)event_data); +#endif + break; /* These are what external supplicant/authenticator wants */ /* fall through */ case WLC_E_LINK: @@ -1530,7 +1693,7 @@ dhd_aoe_arp_clr(dhd_pub_t *dhd, int idx) { int ret = 0; int iov_len = 0; - char iovbuf[128]; + char iovbuf[DHD_IOVAR_BUF_SIZE]; if (dhd == NULL) return; if (dhd->arp_version == 1) @@ -1546,7 +1709,7 @@ dhd_aoe_hostip_clr(dhd_pub_t *dhd, int idx) { int ret = 0; int iov_len = 0; - char iovbuf[128]; + char iovbuf[DHD_IOVAR_BUF_SIZE]; if (dhd == NULL) return; if (dhd->arp_version == 1) @@ -1561,7 +1724,7 @@ void dhd_arp_offload_add_ip(dhd_pub_t *dhd, uint32 ipaddr, int idx) { int iov_len = 0; - char iovbuf[32]; + char iovbuf[DHD_IOVAR_BUF_SIZE]; int retcode; @@ -1619,6 +1782,84 @@ dhd_arp_get_arp_hostip_table(dhd_pub_t *dhd, void *buf, int buflen, int idx) return 0; } #endif /* ARP_OFFLOAD_SUPPORT */ +/* + * Neighbor Discovery Offload: enable NDO feature + * Called by ipv6 event handler when interface comes up/goes down + */ +int +dhd_ndo_enable(dhd_pub_t * dhd, int ndo_enable) +{ + char iovbuf[DHD_IOVAR_BUF_SIZE]; + int retcode; + + if (dhd == NULL) + return -1; + + bcm_mkiovar("ndoe", (char *)&ndo_enable, 4, iovbuf, sizeof(iovbuf)); + retcode = dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); + if (retcode) + DHD_ERROR(("%s: failed to enabe ndo to %d, retcode = %d\n", + __FUNCTION__, ndo_enable, retcode)); + else + DHD_TRACE(("%s: successfully enabed ndo offload to %d\n", + __FUNCTION__, ndo_enable)); + + return retcode; +} + +/* + * Neighbor Discover Offload: add host ipv6 ip into firmware + * Called by ipv6 event handler when interface comes up + */ +int +dhd_ndo_add_ip(dhd_pub_t *dhd, char* ipv6addr, int idx) +{ + int iov_len = 0; + char iovbuf[DHD_IOVAR_BUF_SIZE]; + int retcode; + + if (dhd == NULL || ipv6addr == NULL) + return -1; + + iov_len = bcm_mkiovar("nd_hostip", ipv6addr, + IPV6_ADDR_LEN, iovbuf, sizeof(iovbuf)); + retcode = dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, iov_len, TRUE, idx); + + if (retcode) + DHD_ERROR(("%s: ndo ip addr add failed, retcode = %d\n", + __FUNCTION__, retcode)); + else + DHD_ERROR(("%s: ndo ipaddr entry added \n", + __FUNCTION__)); + return retcode; +} +/* + * Neighbor Discover Offload: disable NDO feature + * Called by ipv6 event handler when interface goes down + */ +int +dhd_ndo_remove_ip(dhd_pub_t *dhd, int idx) +{ + int iov_len = 0; + char iovbuf[DHD_IOVAR_BUF_SIZE]; + int retcode; + + if (dhd == NULL) + return -1; + + iov_len = bcm_mkiovar("nd_hostip_clear", (char *)NULL, + 0, iovbuf, sizeof(iovbuf)); + retcode = dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, iov_len, TRUE, idx); + + if (retcode) + DHD_ERROR(("%s: ndo ip addr remove failed, retcode = %d\n", + __FUNCTION__, retcode)); + else + DHD_TRACE(("%s: ndo ipaddr entry removed \n", + __FUNCTION__)); + + return retcode; +} /* send up locally generated event */ void @@ -1868,9 +2109,9 @@ dhd_get_suspend_bcn_li_dtim(dhd_pub_t *dhd) { int bcn_li_dtim = 1; /* deafult no dtim skip setting */ int ret = -1; - int dtim_assoc = 0; + int dtim_period = 0; int ap_beacon = 0; - + int allowed_skip_dtim_cnt = 0; /* Check if associated */ if (dhd_is_associated(dhd, NULL, NULL) == FALSE) { DHD_TRACE(("%s NOT assoc ret %d\n", __FUNCTION__, ret)); @@ -1885,20 +2126,20 @@ dhd_get_suspend_bcn_li_dtim(dhd_pub_t *dhd) } /* if associated APs Beacon more that 100msec do no dtim skip */ - if (ap_beacon > MAX_DTIM_SKIP_BEACON_ITERVAL) { + if (ap_beacon > MAX_DTIM_SKIP_BEACON_INTERVAL) { DHD_ERROR(("%s NO dtim skip for AP with beacon %d ms\n", __FUNCTION__, ap_beacon)); goto exit; } /* read associated ap's dtim setup */ if ((ret = dhd_wl_ioctl_cmd(dhd, WLC_GET_DTIMPRD, - &dtim_assoc, sizeof(dtim_assoc), FALSE, 0)) < 0) { + &dtim_period, sizeof(dtim_period), FALSE, 0)) < 0) { DHD_ERROR(("%s failed code %d\n", __FUNCTION__, ret)); goto exit; } /* if not assocated just eixt */ - if (dtim_assoc == 0) { + if (dtim_period == 0) { goto exit; } @@ -1906,22 +2147,27 @@ dhd_get_suspend_bcn_li_dtim(dhd_pub_t *dhd) bcn_li_dtim = dhd->suspend_bcn_li_dtim; /* check if sta listen interval fits into AP dtim */ - if (dtim_assoc > LISTEN_INTERVAL) { + if (dtim_period > CUSTOM_LISTEN_INTERVAL) { /* AP DTIM to big for our Listen Interval : no dtim skiping */ - bcn_li_dtim = 1; + bcn_li_dtim = NO_DTIM_SKIP; DHD_ERROR(("%s DTIM=%d > Listen=%d : too big ...\n", - __FUNCTION__, dtim_assoc, LISTEN_INTERVAL)); + __FUNCTION__, dtim_period, CUSTOM_LISTEN_INTERVAL)); goto exit; } - if ((bcn_li_dtim * dtim_assoc) > LISTEN_INTERVAL) { + if ((dtim_period * ap_beacon * bcn_li_dtim) > MAX_DTIM_ALLOWED_INTERVAL) { + allowed_skip_dtim_cnt = MAX_DTIM_ALLOWED_INTERVAL / (dtim_period * ap_beacon); + bcn_li_dtim = (allowed_skip_dtim_cnt != 0) ? allowed_skip_dtim_cnt : NO_DTIM_SKIP; + } + + if ((bcn_li_dtim * dtim_period) > CUSTOM_LISTEN_INTERVAL) { /* Round up dtim_skip to fit into STAs Listen Interval */ - bcn_li_dtim = (int)(LISTEN_INTERVAL / dtim_assoc); + bcn_li_dtim = (int)(CUSTOM_LISTEN_INTERVAL / dtim_period); DHD_TRACE(("%s agjust dtim_skip as %d\n", __FUNCTION__, bcn_li_dtim)); } DHD_ERROR(("%s beacon=%d bcn_li_dtim=%d DTIM=%d Listen=%d\n", - __FUNCTION__, ap_beacon, bcn_li_dtim, dtim_assoc, LISTEN_INTERVAL)); + __FUNCTION__, ap_beacon, bcn_li_dtim, dtim_period, CUSTOM_LISTEN_INTERVAL)); exit: return bcn_li_dtim; @@ -1939,207 +2185,6 @@ bool dhd_support_sta_mode(dhd_pub_t *dhd) return TRUE; } -#if defined(PNO_SUPPORT) -int -dhd_pno_clean(dhd_pub_t *dhd) -{ - char iovbuf[128]; - int pfn_enabled = 0; - int iov_len = 0; - int ret; - - /* Disable pfn */ - iov_len = bcm_mkiovar("pfn", (char *)&pfn_enabled, 4, iovbuf, sizeof(iovbuf)); - if ((ret = dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0)) >= 0) { - /* clear pfn */ - iov_len = bcm_mkiovar("pfnclear", 0, 0, iovbuf, sizeof(iovbuf)); - if (iov_len) { - if ((ret = dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, - iov_len, TRUE, 0)) < 0) { - DHD_ERROR(("%s failed code %d\n", __FUNCTION__, ret)); - } - } - else { - ret = -1; - DHD_ERROR(("%s failed code %d\n", __FUNCTION__, iov_len)); - } - } - else - DHD_ERROR(("%s failed code %d\n", __FUNCTION__, ret)); - - return ret; -} - -int -dhd_pno_enable(dhd_pub_t *dhd, int pfn_enabled) -{ - char iovbuf[128]; - int ret = -1; - - if ((!dhd) && ((pfn_enabled != 0) || (pfn_enabled != 1))) { - DHD_ERROR(("%s error exit\n", __FUNCTION__)); - return ret; - } - -#ifndef WL_SCHED_SCAN - if (!dhd_support_sta_mode(dhd)) - return (ret); - - memset(iovbuf, 0, sizeof(iovbuf)); - - if ((pfn_enabled) && (dhd_is_associated(dhd, NULL, NULL) == TRUE)) { - DHD_ERROR(("%s pno is NOT enable : called in assoc mode , ignore\n", __FUNCTION__)); - return ret; - } -#endif /* !WL_SCHED_SCAN */ - - /* Enable/disable PNO */ - if ((ret = bcm_mkiovar("pfn", (char *)&pfn_enabled, 4, iovbuf, sizeof(iovbuf))) > 0) { - if ((ret = dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, - iovbuf, sizeof(iovbuf), TRUE, 0)) < 0) { - DHD_ERROR(("%s failed for error=%d\n", __FUNCTION__, ret)); - return ret; - } - else { - dhd->pno_enable = pfn_enabled; - DHD_TRACE(("%s set pno as %s\n", - __FUNCTION__, dhd->pno_enable ? "Enable" : "Disable")); - } - } - else DHD_ERROR(("%s failed err=%d\n", __FUNCTION__, ret)); - - return ret; -} - -/* Function to execute combined scan */ -int -dhd_pno_set(dhd_pub_t *dhd, wlc_ssid_t* ssids_local, int nssid, ushort scan_fr, - int pno_repeat, int pno_freq_expo_max) -{ - int err = -1; - char iovbuf[128]; - int k, i; - wl_pfn_param_t pfn_param; - wl_pfn_t pfn_element; - uint len = 0; - - DHD_TRACE(("%s nssid=%d nchan=%d\n", __FUNCTION__, nssid, scan_fr)); - - if ((!dhd) || (!ssids_local)) { - DHD_ERROR(("%s error exit(%s %s)\n", __FUNCTION__, - (!dhd)?"dhd is null":"", (!ssids_local)?"ssid is null":"")); - err = -1; - return err; - } -#ifndef WL_SCHED_SCAN - if (!dhd_support_sta_mode(dhd)) - return err; -#endif /* !WL_SCHED_SCAN */ - - /* Check for broadcast ssid */ - for (k = 0; k < nssid; k++) { - if (!ssids_local[k].SSID_len) { - DHD_ERROR(("%d: Broadcast SSID is ilegal for PNO setting\n", k)); - return err; - } - } -/* #define PNO_DUMP 1 */ -#ifdef PNO_DUMP - { - int j; - for (j = 0; j < nssid; j++) { - DHD_ERROR(("%d: scan for %s size =%d\n", j, - ssids_local[j].SSID, ssids_local[j].SSID_len)); - } - } -#endif /* PNO_DUMP */ - - /* clean up everything */ - if ((err = dhd_pno_clean(dhd)) < 0) { - DHD_ERROR(("%s failed error=%d\n", __FUNCTION__, err)); - return err; - } - memset(iovbuf, 0, sizeof(iovbuf)); - memset(&pfn_param, 0, sizeof(pfn_param)); - memset(&pfn_element, 0, sizeof(pfn_element)); - - /* set pfn parameters */ - pfn_param.version = htod32(PFN_VERSION); - pfn_param.flags = htod16((PFN_LIST_ORDER << SORT_CRITERIA_BIT)); - - /* check and set extra pno params */ - if ((pno_repeat != 0) || (pno_freq_expo_max != 0)) { - pfn_param.flags |= htod16(ENABLE << ENABLE_ADAPTSCAN_BIT); - pfn_param.repeat = (uchar) (pno_repeat); - pfn_param.exp = (uchar) (pno_freq_expo_max); - } - /* set up pno scan fr */ - if (scan_fr != 0) - pfn_param.scan_freq = htod32(scan_fr); - - if (pfn_param.scan_freq > PNO_SCAN_MAX_FW_SEC) { - DHD_ERROR(("%s pno freq above %d sec\n", __FUNCTION__, PNO_SCAN_MAX_FW_SEC)); - return err; - } - if (pfn_param.scan_freq < PNO_SCAN_MIN_FW_SEC) { - DHD_ERROR(("%s pno freq less %d sec\n", __FUNCTION__, PNO_SCAN_MIN_FW_SEC)); - return err; - } - - len = bcm_mkiovar("pfn_set", (char *)&pfn_param, sizeof(pfn_param), iovbuf, sizeof(iovbuf)); - if ((err = dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, len, TRUE, 0)) < 0) { - DHD_ERROR(("%s pfn_set failed for error=%d\n", - __FUNCTION__, err)); - return err; - } - - /* set all pfn ssid */ - for (i = 0; i < nssid; i++) { - - pfn_element.infra = htod32(DOT11_BSSTYPE_INFRASTRUCTURE); - pfn_element.auth = (DOT11_OPEN_SYSTEM); - pfn_element.wpa_auth = htod32(WPA_AUTH_PFN_ANY); - pfn_element.wsec = htod32(0); - pfn_element.infra = htod32(1); - pfn_element.flags = htod32(ENABLE << WL_PFN_HIDDEN_BIT); - memcpy((char *)pfn_element.ssid.SSID, ssids_local[i].SSID, ssids_local[i].SSID_len); - pfn_element.ssid.SSID_len = ssids_local[i].SSID_len; - - if ((len = - bcm_mkiovar("pfn_add", (char *)&pfn_element, - sizeof(pfn_element), iovbuf, sizeof(iovbuf))) > 0) { - if ((err = - dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, len, TRUE, 0)) < 0) { - DHD_ERROR(("%s failed for i=%d error=%d\n", - __FUNCTION__, i, err)); - return err; - } - else - DHD_TRACE(("%s set OK with PNO time=%d repeat=%d max_adjust=%d\n", - __FUNCTION__, pfn_param.scan_freq, - pfn_param.repeat, pfn_param.exp)); - } - else DHD_ERROR(("%s failed err=%d\n", __FUNCTION__, err)); - } - - /* Enable PNO */ - /* dhd_pno_enable(dhd, 1); */ - return err; -} - -int -dhd_pno_get_status(dhd_pub_t *dhd) -{ - int ret = -1; - - if (!dhd) - return ret; - else - return (dhd->pno_enable); -} - -#endif /* OEM_ANDROID && PNO_SUPPORT */ - #if defined(KEEP_ALIVE) int dhd_keep_alive_onoff(dhd_pub_t *dhd) { diff --git a/drivers/net/wireless/bcmdhd/dhd_custom_gpio.c b/drivers/net/wireless/bcmdhd/dhd_custom_gpio.c index 3782b715ab1..a5093a6bfcc 100644 --- a/drivers/net/wireless/bcmdhd/dhd_custom_gpio.c +++ b/drivers/net/wireless/bcmdhd/dhd_custom_gpio.c @@ -1,6 +1,6 @@ /* * Customer code to add GPIO control during WLAN start/stop -* Copyright (C) 1999-2012, Broadcom Corporation +* Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -20,7 +20,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * -* $Id: dhd_custom_gpio.c 353280 2012-08-26 04:33:17Z $ +* $Id: dhd_custom_gpio.c 441177 2013-12-05 07:03:52Z $ */ #include @@ -38,6 +38,11 @@ #define WL_TRACE(x) #if defined(CUSTOMER_HW4) + +#if defined(PLATFORM_MPS) +int __attribute__ ((weak)) wifi_get_fw_nv_path(char *fw, char *nv) { return 0;}; +#endif + #ifdef CONFIG_WIFI_CONTROL_FUNC int wifi_set_power(int on, unsigned long msec); int wifi_get_irq_number(unsigned long *irq_flags_ptr); @@ -57,6 +62,9 @@ void *wifi_get_country_code(char *ccode) { return NULL; } extern int sdioh_mmc_irq(int irq); #endif /* (BCMLXSDMMC) */ +#if defined(PLATFORM_MPS) +#include +#endif /* Customer specific Host GPIO defintion */ static int dhd_oob_gpio_num = -1; @@ -79,7 +87,7 @@ int dhd_customer_oob_irq_map(unsigned long *irq_flags_ptr) { int host_oob_irq = 0; -#if defined(CUSTOMER_HW4) +#if defined(CUSTOMER_HW4) && !defined(PLATFORM_MPS) host_oob_irq = wifi_get_irq_number(irq_flags_ptr); #else @@ -98,6 +106,11 @@ int dhd_customer_oob_irq_map(unsigned long *irq_flags_ptr) WL_ERROR(("%s: customer specific Host GPIO number is (%d)\n", __FUNCTION__, dhd_oob_gpio_num)); +#if defined(PLATFORM_MPS) + gpio_request(dhd_oob_gpio_num, "oob irq"); + host_oob_irq = gpio_to_irq(dhd_oob_gpio_num); + gpio_direction_input(dhd_oob_gpio_num); +#endif #endif return (host_oob_irq); @@ -122,7 +135,7 @@ dhd_customer_gpio_wlan_ctrl(int onoff) WL_TRACE(("%s: callc customer specific GPIO to remove WLAN RESET\n", __FUNCTION__)); #if defined(CUSTOMER_HW4) - wifi_set_power(1, 200); + wifi_set_power(1, WIFI_TURNON_DELAY); #endif WL_ERROR(("=========== WLAN going back to live ========\n")); break; @@ -151,7 +164,7 @@ dhd_custom_get_mac_address(unsigned char *buf) return -EINVAL; /* Customer access to MAC address stored outside of DHD driver */ -#if 0 && (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 35)) +#if (0 || 0) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 35)) ret = wifi_get_mac_addr(buf); #endif @@ -167,7 +180,7 @@ dhd_custom_get_mac_address(unsigned char *buf) } #endif /* GET_CUSTOM_MAC_ENABLE */ -#ifndef CUSTOMER_HW4 +#if !defined(CUSTOMER_HW4) || defined(PLATFORM_MPS) /* Customized Locale table : OPTIONAL feature */ const struct cntry_locales_custom translate_custom_table[] = { /* Table should be filled out based on custom platform regulatory requirement */ diff --git a/drivers/net/wireless/bcmdhd/dhd_custom_sec.c b/drivers/net/wireless/bcmdhd/dhd_custom_sec.c index 51a4737bb8a..080d43c1d7b 100644 --- a/drivers/net/wireless/bcmdhd/dhd_custom_sec.c +++ b/drivers/net/wireless/bcmdhd/dhd_custom_sec.c @@ -1,14 +1,14 @@ /* * Customer HW 4 dependant file * - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2013, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -16,30 +16,13 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * * $Id: dhd_custom_sec.c 334946 2012-05-24 20:38:00Z $ */ - -/* Function list - 1. Module Type - a. For CID - Use 'USE_CID_CHECK' Feature - dhd_write_cid_file(), dhd_dump_cis(), dhd_check_module_cid() - b. For MAC - Use 'GET_MAC_FROM_OTP' Feature - dhd_write_mac_file(), dhd_check_module_mac() - 2. COB Type - a. For MAC - Use 'READ_MACADDR' Feature - dhd_read_macaddr() - 3. Etc - a. Power Save Mode - Use 'CONFIG_CONTROL_PM' Feature - sec_control_pm() - b. Frame Burst Control (11ac) - Use 'USE_WL_FRAMEBURST' Feature - sec_control_frameburst() - */ - #ifdef CUSTOMER_HW4 #include #include @@ -124,7 +107,6 @@ const struct cntry_locales_custom translate_custom_table[] = { #endif /* defined(BCM4330_CHIP) || defined(BCM4334_CHIP) || defined(BCM43241_CHIP) */ #if defined(BCM4334_CHIP) || defined(BCM43241_CHIP) {"RU", "RU", 13}, - {"SG", "SG", 4}, {"US", "US", 46}, {"UA", "UA", 8}, {"CO", "CO", 4}, @@ -262,7 +244,6 @@ const struct cntry_locales_custom translate_custom_table[] = { {"RO", "RO", 4}, {"SN", "SN", 2}, {"RS", "RS", 2}, - {"SG", "SG", 4}, {"SK", "SK", 4}, {"SI", "SI", 4}, {"ES", "ES", 4}, @@ -1230,8 +1211,10 @@ void sec_control_pm(dhd_pub_t *dhd, uint *power_mode) char *filepath = PSMINFO; char power_val = 0; char iovbuf[WL_EVENTING_MASK_LEN + 12]; +#ifdef DHD_ENABLE_LPC int ret = 0; uint32 lpc = 0; +#endif /* DHD_ENABLE_LPC */ g_pm_control = FALSE; @@ -1269,12 +1252,14 @@ void sec_control_pm(dhd_pub_t *dhd, uint *power_mode) dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); #endif +#ifdef DHD_ENABLE_LPC /* Set lpc 0 */ bcm_mkiovar("lpc", (char *)&lpc, 4, iovbuf, sizeof(iovbuf)); if ((ret = dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0)) < 0) { DHD_ERROR(("%s Set lpc failed %d\n", __FUNCTION__, ret)); } +#endif /* DHD_ENABLE_LPC */ } else { dhd_wl_ioctl_cmd(dhd, WLC_SET_PM, (char *)power_mode, sizeof(uint), TRUE, 0); @@ -1448,4 +1433,131 @@ int sec_get_param(dhd_pub_t *dhd, int mode) return val; } #endif /* USE_WFA_CERT_CONF */ + +#ifdef WRITE_WLANINFO +#define Firm_prefix "Firm_ver:" +#define DHD_prefix "DHD_ver:" +#define Nv_prefix "Nv_info:" +#define max_len(a,b) (sizeof(a)/2 - strlen(b) - 3) +#define tstr_len(a,b) (strlen(a) + strlen(b) + 3) + +char version_info[512]; +char version_old_info[512]; + +int write_filesystem(struct file* file, unsigned long long offset, unsigned char* data, unsigned int size) +{ + mm_segment_t oldfs; + int ret; + + oldfs = get_fs(); + set_fs(get_ds()); + + ret = vfs_write(file, data, size, &offset); + + set_fs(oldfs); + return ret; +} + +uint32 sec_save_wlinfo(char* firm_ver, char* dhd_ver, char* nvram_p) +{ + struct file *fp = NULL; + struct file *nvfp = NULL; + char *filepath = "/data/.wifiver.info"; + int min_len, str_len = 0; + int ret = 0; + char* nvram_buf; + char temp_buf[256]; + + DHD_TRACE(("[WIFI] %s: Entered.\n", __FUNCTION__)); + + DHD_INFO(("[WIFI] firmware version : %s\n", firm_ver)); + DHD_INFO(("[WIFI] dhd driver version : %s\n", dhd_ver)); + DHD_INFO(("[WIFI] nvram path : %s\n", nvram_p)); + + memset(version_info,0,sizeof(version_info)); + + if(strlen(dhd_ver)){ + min_len = min(strlen(dhd_ver) , max_len(temp_buf, DHD_prefix)); + min_len += strlen(DHD_prefix) + 3; + DHD_INFO(("[WIFI] DHD ver length : %d\n", min_len)); + snprintf(version_info+str_len, min_len, DHD_prefix " %s\n",dhd_ver); + str_len = strlen(version_info); + + DHD_INFO(("[WIFI] version_info len : %d\n", str_len)); + DHD_INFO(("[WIFI] version_info : %s\n", version_info)); + }else{ + DHD_ERROR(("[WIFI] Driver version is missing.\n")); + } + + if(strlen(firm_ver)){ + min_len = min(strlen(firm_ver) , max_len(temp_buf, Firm_prefix)); + min_len += strlen(Firm_prefix) + 3; + DHD_INFO(("[WIFI] firmware ver length : %d\n", min_len)); + snprintf(version_info+str_len, min_len, Firm_prefix " %s\n",firm_ver); + str_len = strlen(version_info); + + DHD_INFO(("[WIFI] version_info len : %d\n", str_len)); + DHD_INFO(("[WIFI] version_info : %s\n", version_info)); + }else{ + DHD_ERROR(("[WIFI] Firmware version is missing.\n")); + } + + if(nvram_p){ + memset(temp_buf,0,sizeof(temp_buf)); + nvfp = filp_open(nvram_p, O_RDONLY, 0); + if (IS_ERR(nvfp) || (nvfp == NULL)) { + DHD_ERROR(("[WIFI] %s: Nvarm File open failed.\n", __FUNCTION__)); + return -1; + } else { + ret = kernel_read(nvfp, nvfp->f_pos, temp_buf, sizeof(temp_buf)); + filp_close(nvfp, NULL); + } + + if(strlen(temp_buf)){ + nvram_buf = temp_buf; + bcmstrtok(&nvram_buf, "\n", 0); + DHD_INFO(("[WIFI] nvram tolkening : %s(%d) \n", temp_buf, strlen(temp_buf))); + snprintf(version_info+str_len, tstr_len(temp_buf, Nv_prefix), Nv_prefix " %s\n", temp_buf); + str_len = strlen(version_info); + DHD_INFO(("[WIFI] version_info : %s\n", version_info)); + DHD_INFO(("[WIFI] version_info len : %d, nvram len : %d\n", str_len, strlen(temp_buf))); + }else{ + DHD_ERROR(("[WIFI] No info is missing.\n")); + } + }else{ + DHD_ERROR(("[WIFI] No nvram path\n")); + } + + DHD_INFO(("[WIFI] version_info : %s, strlen : %d\n", version_info,strlen(version_info))); + + fp = filp_open(filepath, O_RDONLY, 0); + if (fp != NULL) { + if (IS_ERR(fp) || (fp == NULL)) { + DHD_INFO(("[WIFI] %s: File open failed.\n", __FUNCTION__)); + } else { + memset(version_old_info, 0, sizeof(version_old_info)); + ret = kernel_read(fp, fp->f_pos, version_old_info, sizeof(version_info)); + filp_close(fp, NULL); + DHD_INFO(("[WIFI] kernel_read ret : %d.\n", ret)); + if(strcmp(version_info,version_old_info) == 0){ + DHD_ERROR(("[WIFI] %s: : already saved.\n", __FUNCTION__)); + return 0; + } + } + } + + fp = filp_open(filepath, O_RDWR | O_CREAT, 0666); + if (IS_ERR(fp) || (fp == NULL)) { + DHD_ERROR(("[WIFI] %s: File open failed.\n", + __FUNCTION__)); + } else { + ret = write_filesystem(fp, fp->f_pos, version_info, sizeof(version_info)); + DHD_INFO(("[WIFI] sec_save_wlinfo done. ret : %d\n",ret)); + DHD_ERROR(("[WIFI] save .wifiver.info file.\n")); + filp_close(fp, NULL); + } + return ret; +} +#endif /* WRITE_WLANINFO */ + #endif /* CUSTOMER_HW4 */ diff --git a/drivers/net/wireless/bcmdhd/dhd_dbg.h b/drivers/net/wireless/bcmdhd/dhd_dbg.h index df3f5b0f29d..9e73ef05be5 100644 --- a/drivers/net/wireless/bcmdhd/dhd_dbg.h +++ b/drivers/net/wireless/bcmdhd/dhd_dbg.h @@ -1,7 +1,7 @@ /* * Debug/trace/assert driver definitions for Dongle Host Driver. * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -21,7 +21,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: dhd_dbg.h 353883 2012-08-29 04:43:40Z $ + * $Id: dhd_dbg.h 419132 2013-08-19 21:33:05Z $ */ #ifndef _dhd_dbg_ @@ -51,6 +51,7 @@ #define DHD_ISCAN(args) do {if (dhd_msg_level & DHD_ISCAN_VAL) printf args;} while (0) #define DHD_ARPOE(args) do {if (dhd_msg_level & DHD_ARPOE_VAL) printf args;} while (0) #define DHD_REORDER(args) do {if (dhd_msg_level & DHD_REORDER_VAL) printf args;} while (0) +#define DHD_PNO(args) do {if (dhd_msg_level & DHD_PNO_VAL) printf args;} while (0) #ifdef CUSTOMER_HW4 #define DHD_TRACE_HW4 DHD_ERROR @@ -74,6 +75,7 @@ #define DHD_ARPOE_ON() (dhd_msg_level & DHD_ARPOE_VAL) #define DHD_REORDER_ON() (dhd_msg_level & DHD_REORDER_VAL) #define DHD_NOCHECKDIED_ON() (dhd_msg_level & DHD_NOCHECKDIED_VAL) +#define DHD_PNO_ON() (dhd_msg_level & DHD_PNO_VAL) #else /* defined(BCMDBG) || defined(DHD_DEBUG) */ @@ -92,6 +94,7 @@ #define DHD_ISCAN(args) #define DHD_ARPOE(args) #define DHD_REORDER(args) +#define DHD_PNO(args) #ifdef CUSTOMER_HW4 #define DHD_TRACE_HW4 DHD_ERROR @@ -115,6 +118,8 @@ #define DHD_ARPOE_ON() 0 #define DHD_REORDER_ON() 0 #define DHD_NOCHECKDIED_ON() 0 +#define DHD_PNO_ON() 0 + #endif #define DHD_LOG(args) diff --git a/drivers/net/wireless/bcmdhd/dhd_ip.c b/drivers/net/wireless/bcmdhd/dhd_ip.c new file mode 100644 index 00000000000..b4fb5e3c36f --- /dev/null +++ b/drivers/net/wireless/bcmdhd/dhd_ip.c @@ -0,0 +1,111 @@ +/* + * IP Packet Parser Module. + * + * Copyright (C) 1999-2013, Broadcom Corporation + * + * Unless you and Broadcom execute a separate written software license + * agreement governing use of this software, this software is licensed to you + * under the terms of the GNU General Public License version 2 (the "GPL"), + * available at http://www.broadcom.com/licenses/GPLv2.php, with the + * following added to such license: + * + * As a special exception, the copyright holders of this software give you + * permission to link this software with independent modules, and to copy and + * distribute the resulting executable under terms of your choice, provided that + * you also meet, for each linked independent module, the terms and conditions of + * the license of that module. An independent module is a module which is not + * derived from this software. The special exception does not apply to any + * modifications of the software. + * + * Notwithstanding the above, under no circumstances may you combine this + * software in any way with any other Broadcom software provided under a license + * other than the GPL, without Broadcom's express prior written consent. + * + * $Id$ + */ +#include +#include + +#include +#include +#include +#include +#include + +#include + +#include + +/* special values */ +/* 802.3 llc/snap header */ +static const uint8 llc_snap_hdr[SNAP_HDR_LEN] = {0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00}; + +pkt_frag_t pkt_frag_info(osl_t *osh, void *p) +{ + uint8 *frame; + int length; + uint8 *pt; /* Pointer to type field */ + uint16 ethertype; + struct ipv4_hdr *iph; /* IP frame pointer */ + int ipl; /* IP frame length */ + uint16 iph_frag; + + ASSERT(osh && p); + + frame = PKTDATA(osh, p); + length = PKTLEN(osh, p); + + /* Process Ethernet II or SNAP-encapsulated 802.3 frames */ + if (length < ETHER_HDR_LEN) { + DHD_INFO(("%s: short eth frame (%d)\n", __FUNCTION__, length)); + return DHD_PKT_FRAG_NONE; + } else if (ntoh16(*(uint16 *)(frame + ETHER_TYPE_OFFSET)) >= ETHER_TYPE_MIN) { + /* Frame is Ethernet II */ + pt = frame + ETHER_TYPE_OFFSET; + } else if (length >= ETHER_HDR_LEN + SNAP_HDR_LEN + ETHER_TYPE_LEN && + !bcmp(llc_snap_hdr, frame + ETHER_HDR_LEN, SNAP_HDR_LEN)) { + pt = frame + ETHER_HDR_LEN + SNAP_HDR_LEN; + } else { + DHD_INFO(("%s: non-SNAP 802.3 frame\n", __FUNCTION__)); + return DHD_PKT_FRAG_NONE; + } + + ethertype = ntoh16(*(uint16 *)pt); + + /* Skip VLAN tag, if any */ + if (ethertype == ETHER_TYPE_8021Q) { + pt += VLAN_TAG_LEN; + + if (pt + ETHER_TYPE_LEN > frame + length) { + DHD_INFO(("%s: short VLAN frame (%d)\n", __FUNCTION__, length)); + return DHD_PKT_FRAG_NONE; + } + + ethertype = ntoh16(*(uint16 *)pt); + } + + if (ethertype != ETHER_TYPE_IP) { + DHD_INFO(("%s: non-IP frame (ethertype 0x%x, length %d)\n", + __FUNCTION__, ethertype, length)); + return DHD_PKT_FRAG_NONE; + } + + iph = (struct ipv4_hdr *)(pt + ETHER_TYPE_LEN); + ipl = length - (pt + ETHER_TYPE_LEN - frame); + + /* We support IPv4 only */ + if ((ipl < IPV4_OPTIONS_OFFSET) || (IP_VER(iph) != IP_VER_4)) { + DHD_INFO(("%s: short frame (%d) or non-IPv4\n", __FUNCTION__, ipl)); + return DHD_PKT_FRAG_NONE; + } + + iph_frag = ntoh16(iph->frag); + + if (iph_frag & IPV4_FRAG_DONT) { + return DHD_PKT_FRAG_NONE; + } else if ((iph_frag & IPV4_FRAG_MORE) == 0) { + return DHD_PKT_FRAG_LAST; + } else { + return (iph_frag & IPV4_FRAG_OFFSET_MASK)? DHD_PKT_FRAG_CONT : DHD_PKT_FRAG_FIRST; + } +} diff --git a/drivers/net/wireless/bcmdhd/dhd_ip.h b/drivers/net/wireless/bcmdhd/dhd_ip.h new file mode 100644 index 00000000000..ceb3877549c --- /dev/null +++ b/drivers/net/wireless/bcmdhd/dhd_ip.h @@ -0,0 +1,42 @@ +/* + * Header file describing the common ip parser function. + * + * Provides type definitions and function prototypes used to parse ip packet. + * + * Copyright (C) 1999-2013, Broadcom Corporation + * + * Unless you and Broadcom execute a separate written software license + * agreement governing use of this software, this software is licensed to you + * under the terms of the GNU General Public License version 2 (the "GPL"), + * available at http://www.broadcom.com/licenses/GPLv2.php, with the + * following added to such license: + * + * As a special exception, the copyright holders of this software give you + * permission to link this software with independent modules, and to copy and + * distribute the resulting executable under terms of your choice, provided that + * you also meet, for each linked independent module, the terms and conditions of + * the license of that module. An independent module is a module which is not + * derived from this software. The special exception does not apply to any + * modifications of the software. + * + * Notwithstanding the above, under no circumstances may you combine this + * software in any way with any other Broadcom software provided under a license + * other than the GPL, without Broadcom's express prior written consent. + * + * $Id$ + */ + +#ifndef _dhd_ip_h_ +#define _dhd_ip_h_ + +typedef enum pkt_frag +{ + DHD_PKT_FRAG_NONE = 0, + DHD_PKT_FRAG_FIRST, + DHD_PKT_FRAG_CONT, + DHD_PKT_FRAG_LAST +} pkt_frag_t; + +extern pkt_frag_t pkt_frag_info(osl_t *osh, void *p); + +#endif /* _dhd_ip_h_ */ diff --git a/drivers/net/wireless/bcmdhd/dhd_linux.c b/drivers/net/wireless/bcmdhd/dhd_linux.c index 5098a580348..516b934b2e5 100644 --- a/drivers/net/wireless/bcmdhd/dhd_linux.c +++ b/drivers/net/wireless/bcmdhd/dhd_linux.c @@ -1,9 +1,8 @@ - /* * Broadcom Dongle Host Driver (DHD), Linux-specific network interface * Basically selected code segments from usb-cdc.c and usb-rndis.c * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -23,7 +22,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: dhd_linux.c 424018 2013-09-15 13:23:56Z $ + * $Id: dhd_linux.c 445384 2013-12-26 11:10:06Z $ */ #include @@ -43,6 +42,11 @@ #include #include #include +#include +#include +#ifdef ENABLE_ADAPTIVE_SCHED +#include +#endif /* ENABLE_ADAPTIVE_SCHED */ #include #include @@ -51,8 +55,10 @@ #include #include #include +#include #include +#include #include #include #include @@ -64,7 +70,9 @@ #ifdef WL_CFG80211 #include #endif - +#ifdef PNO_SUPPORT +#include +#endif #ifdef WLBTAMP #include #include @@ -117,6 +125,13 @@ extern bool ap_fw_loaded; #endif /* FIX_CPU_MIN_CLOCK */ #endif /* CUSTOMER_HW4 */ +#ifdef ENABLE_ADAPTIVE_SCHED +#define DEFAULT_CPUFREQ_THRESH 1000000 /* threshold frequency : 1000000 = 1GHz */ +#ifndef CUSTOM_CPUFREQ_THRESH +#define CUSTOM_CPUFREQ_THRESH DEFAULT_CPUFREQ_THRESH +#endif /* CUSTOM_CPUFREQ_THRESH */ +#endif /* ENABLE_ADAPTIVE_SCHED */ + /* enable HOSTIP cache update from the host side when an eth0:N is up */ #define AOE_IP_ALIAS_SUPPORT 1 @@ -141,6 +156,13 @@ static struct notifier_block dhd_notifier = { .notifier_call = dhd_device_event }; #endif /* ARP_OFFLOAD_SUPPORT */ +static int dhd_device_ipv6_event(struct notifier_block *this, + unsigned long event, + void *ptr); + +static struct notifier_block dhd_notifier_ipv6 = { + .notifier_call = dhd_device_ipv6_event +}; #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) && defined(CONFIG_PM_SLEEP) #include @@ -148,9 +170,9 @@ volatile bool dhd_mmc_suspend = FALSE; DECLARE_WAIT_QUEUE_HEAD(dhd_dpc_wait); #endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) && defined(CONFIG_PM_SLEEP) */ -#if defined(OOB_INTR_ONLY) +#if defined(OOB_INTR_ONLY) || defined(BCMSPI_ANDROID) extern void dhd_enable_oob_intr(struct dhd_bus *bus, bool enable); -#endif /* defined(OOB_INTR_ONLY) */ +#endif /* defined(OOB_INTR_ONLY) || defined(BCMSPI_ANDROID) */ #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) && (1) static void dhd_hang_process(struct work_struct *work); #endif @@ -170,6 +192,16 @@ MODULE_LICENSE("GPL v2"); #endif #endif /* BCM_FD_AGGR */ +#ifdef PROP_TXSTATUS +extern bool dhd_wlfc_skip_fc(void); +extern void dhd_wlfc_plat_enable(void *dhd); +extern void dhd_wlfc_plat_deinit(void *dhd); +#endif /* PROP_TXSTATUS */ +#if defined(CUSTOMER_HW4) && defined(USE_DYNAMIC_F2_BLKSIZE) +extern uint sd_f2_blocksize; +extern int dhdsdio_func_blocksize(dhd_pub_t *dhd, int function_num, int block_size); +#endif /* CUSTOMER_HW4 && USE_DYNAMIC_F2_BLKSIZE */ + #if LINUX_VERSION_CODE == KERNEL_VERSION(2, 6, 15) const char * print_tainted() @@ -179,10 +211,10 @@ print_tainted() #endif /* LINUX_VERSION_CODE == KERNEL_VERSION(2, 6, 15) */ /* Linux wireless extension support */ -#if defined(CONFIG_WIRELESS_EXT) +#if defined(WL_WIRELESS_EXT) #include extern wl_iw_extra_params_t g_wl_iw_params; -#endif /* defined(CONFIG_WIRELESS_EXT) */ +#endif /* defined(WL_WIRELESS_EXT) */ #if defined(CUSTOMER_HW4) && defined(CONFIG_PARTIALSUSPEND_SLP) #include @@ -226,8 +258,9 @@ extern int dhd_check_module_mac(dhd_pub_t *dhd, struct ether_addr *mac); #ifdef MIMO_ANT_SETTING extern int dhd_sel_ant_from_file(dhd_pub_t *dhd); #endif -#ifdef USE_DYNAMIC_F2_BLKSIZE -extern int dhdsdio_func_blocksize(dhd_pub_t *dhd, int function_num, int block_size); + +#ifdef WRITE_WLANINFO +extern uint32 sec_save_wlinfo(char* firm_ver, char* dhd_ver, char* nvram_p); #endif #else @@ -243,6 +276,11 @@ extern int dhd_write_macaddr(struct ether_addr *mac); static inline int dhd_write_macaddr(struct ether_addr *mac) { return 0; } #endif #endif /* CUSTOMER_HW4 */ +struct ipv6_addr { + char ipv6_addr[IPV6_ADDR_LEN]; + dhd_ipv6_op_t ipv6_oper; + struct list_head list; +}; /* Interface control information */ typedef struct dhd_if { @@ -259,6 +297,8 @@ typedef struct dhd_if { char name[IFNAMSIZ+1]; /* linux interface name */ uint8 bssidx; /* bsscfg index for the interface */ bool set_multicast; + struct list_head ipv6_list; + spinlock_t ipv6_lock; bool event2cfg80211; /* To determine if pass event to cfg80211 */ } dhd_if_t; @@ -292,9 +332,9 @@ static uint32 maxdelay = 0, tspktcnt = 0, maxdelaypktno = 0; /* Local private structure (extension of pub) */ typedef struct dhd_info { -#if defined(CONFIG_WIRELESS_EXT) +#if defined(WL_WIRELESS_EXT) wl_iw_t iw; /* wireless extensions state (must be first) */ -#endif /* defined(CONFIG_WIRELESS_EXT) */ +#endif /* defined(WL_WIRELESS_EXT) */ dhd_pub_t pub; @@ -309,6 +349,8 @@ typedef struct dhd_info { htsf_t htsf; #endif wait_queue_head_t ioctl_resp_wait; + uint32 default_wd_interval; + struct timer_list timer; bool wd_timer_valid; struct tasklet_struct tasklet; @@ -335,10 +377,10 @@ typedef struct dhd_info { /* Wakelocks */ #if defined(CONFIG_HAS_WAKELOCK) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) - struct wake_lock *wl_wifi; /* Wifi wakelock */ - struct wake_lock *wl_rxwake; /* Wifi rx wakelock */ - struct wake_lock *wl_ctrlwake; /* Wifi ctrl wakelock */ - struct wake_lock *wl_wdwake; /* Wifi wd wakelock */ + struct wake_lock wl_wifi; /* Wifi wakelock */ + struct wake_lock wl_rxwake; /* Wifi rx wakelock */ + struct wake_lock wl_ctrlwake; /* Wifi ctrl wakelock */ + struct wake_lock wl_wdwake; /* Wifi wd wakelock */ #endif #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25)) && 1 @@ -388,6 +430,8 @@ typedef struct dhd_info { #endif /* FIX_BUS_MIN_CLOCK */ #endif /* FIX_CPU_MIN_CLOCK */ #endif /* CUSTOMER_HW4 */ + + struct notifier_block pm_notifier; } dhd_info_t; /* Flag to indicate if we should download firmware on driver load */ @@ -399,6 +443,9 @@ uint dhd_download_fw_on_driverload = TRUE; char firmware_path[MOD_PARAM_PATHLEN]; char nvram_path[MOD_PARAM_PATHLEN]; +/* information string to keep firmware, chio, cheip version info visiable from log */ +char info_string[MOD_PARAM_INFOLEN]; +module_param_string(info_string, info_string, MOD_PARAM_INFOLEN, 0444); int op_mode = 0; int disable_proptx = 0; module_param(op_mode, int, 0644); @@ -422,9 +469,20 @@ module_param(dhd_msg_level, int, 0); /* ARP offload enable */ uint dhd_arp_enable = TRUE; module_param(dhd_arp_enable, uint, 0); + +/* ARP offload agent mode : Enable ARP Host Auto-Reply and ARP Peer Auto-Reply */ + +#if defined(CUSTOMER_HW4) +uint dhd_arp_mode = ARP_OL_AGENT | ARP_OL_PEER_AUTO_REPLY | ARP_OL_SNOOP; +#else +uint dhd_arp_mode = ARP_OL_AGENT | ARP_OL_PEER_AUTO_REPLY; +#endif + +module_param(dhd_arp_mode, uint, 0); #endif /* ARP_OFFLOAD_SUPPORT */ + /* Disable Prop tx */ module_param(disable_proptx, int, 0644); /* load firmware and/or nvram values from the filesystem */ @@ -435,7 +493,23 @@ module_param_string(nvram_path, nvram_path, MOD_PARAM_PATHLEN, 0660); module_param_string(nvram_path, nvram_path, MOD_PARAM_PATHLEN, 0); #endif /* CUSTOMER_HW4 */ +#if defined(WL_CFG80211) && defined(SUPPORT_DEEP_SLEEP) +/* Flags to indicate if we distingish power off policy when + * user set the memu "Keep Wi-Fi on during sleep" to "Never" + */ +int trigger_deep_sleep = 0; +/* Check the current status of deepsleep mode */ +bool is_deepsleep_on = FALSE; +/* Wi-Fi power up/down control via deepsleep */ +uint use_deepsleep_onoff = 0; +module_param(use_deepsleep_onoff, uint, 0660); +#endif /* WL_CFG80211 && SUPPORT_DEEP_SLEEP */ + /* Watchdog interval */ + +/* extend watchdog expiration to 2 seconds when DPC is running */ +#define WATCHDOG_EXTEND_INTERVAL (2000) + uint dhd_watchdog_ms = 10; module_param(dhd_watchdog_ms, uint, 0); @@ -445,26 +519,9 @@ uint dhd_console_ms = 0; module_param(dhd_console_ms, uint, 0644); #endif /* defined(DHD_DEBUG) */ -#ifdef REPEAT_READFRAME -uint dhd_doflow = 1; -module_param(dhd_doflow, uint, 0644); - -uint dhd_dpcpoll = 1; -module_param(dhd_dpcpoll, uint, 0644); -#endif /* REPEAT_READFRAME */ - uint dhd_slpauto = TRUE; module_param(dhd_slpauto, uint, 0); -/* ARP offload agent mode : Enable ARP Host Auto-Reply and ARP Peer Auto-Reply */ -#if defined(CUSTOMER_HW4) -uint dhd_arp_mode = ARP_OL_AGENT | ARP_OL_PEER_AUTO_REPLY | ARP_OL_SNOOP; -#else -uint dhd_arp_mode = ARP_OL_AGENT | ARP_OL_PEER_AUTO_REPLY; -#endif - -module_param(dhd_arp_mode, uint, 0); - #ifdef PKT_FILTER_SUPPORT /* Global Pkt filter enable control */ uint dhd_pkt_filter_enable = TRUE; @@ -498,8 +555,8 @@ module_param(dhd_rxf_prio, int, 0); #endif /* RXFRAME_THREAD */ /* DPC thread priority, -1 to use tasklet */ -extern int dhd_dongle_memsize; -module_param(dhd_dongle_memsize, int, 0); +extern int dhd_dongle_ramsize; +module_param(dhd_dongle_ramsize, int, 0); #endif /* DHDTHREAD */ /* Control fw roaming */ #ifdef BCMCCX @@ -578,6 +635,7 @@ static char dhd_version[] = "Dongle Host Driver, version " EPI_VERSION_STR "\nCompiled in " SRCBASE " on " __DATE__ " at " __TIME__ #endif ; +int dhd_dev_reset(struct net_device *dev, uint8 flag); static void dhd_net_if_lock_local(dhd_info_t *dhd); static void dhd_net_if_unlock_local(dhd_info_t *dhd); static void dhd_suspend_lock(dhd_pub_t *dhdp); @@ -605,13 +663,14 @@ void sec_control_pm(dhd_pub_t *dhd, uint *); #endif /* CUSTOMER_HW4 & CONFIG_CONTROL_PM */ -#if defined(CONFIG_WIRELESS_EXT) +#if defined(WL_WIRELESS_EXT) struct iw_statistics *dhd_get_wireless_stats(struct net_device *dev); -#endif /* defined(CONFIG_WIRELESS_EXT) */ +#endif /* defined(WL_WIRELESS_EXT) */ static void dhd_dpc(ulong data); /* forward decl */ extern int dhd_wait_pend8021x(struct net_device *dev); +void dhd_os_wd_timer_extend(void *bus, bool extend); #ifdef TOE #ifndef BDC @@ -624,35 +683,42 @@ static int dhd_toe_set(dhd_info_t *dhd, int idx, uint32 toe_ol); static int dhd_wl_host_event(dhd_info_t *dhd, int *ifidx, void *pktdata, wl_event_msg_t *event_ptr, void **data_ptr); -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) && (LINUX_VERSION_CODE <= \ - KERNEL_VERSION(2, 6, 39)) && defined(CONFIG_PM_SLEEP) +#if defined(CONFIG_PM_SLEEP) static int dhd_sleep_pm_callback(struct notifier_block *nfb, unsigned long action, void *ignored) { int ret = NOTIFY_DONE; + bool suspend = FALSE; + dhd_info_t *dhdinfo = (dhd_info_t*)container_of(nfb, struct dhd_info, pm_notifier); + BCM_REFERENCE(dhdinfo); switch (action) { case PM_HIBERNATION_PREPARE: case PM_SUSPEND_PREPARE: - dhd_mmc_suspend = TRUE; - ret = NOTIFY_OK; + suspend = TRUE; break; case PM_POST_HIBERNATION: case PM_POST_SUSPEND: - dhd_mmc_suspend = FALSE; - ret = NOTIFY_OK; + suspend = FALSE; break; } + +#ifdef PROP_TXSTATUS + if (suspend) + dhd_wlfc_suspend(&dhdinfo->pub); + else + dhd_wlfc_resume(&dhdinfo->pub); +#endif + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) && (LINUX_VERSION_CODE <= \ + KERNEL_VERSION(2, 6, 39)) + dhd_mmc_suspend = suspend; smp_mb(); +#endif return ret; } - -static struct notifier_block dhd_sleep_pm_notifier = { - .notifier_call = dhd_sleep_pm_callback, - .priority = 10 -}; extern int register_pm_notifier(struct notifier_block *nb); extern int unregister_pm_notifier(struct notifier_block *nb); -#endif /* LINUX_VERSION >= 2.6.27 && LINUX_VERSION <= 2.6.39 && CONFIG_PM_SLEEP */ +#endif /* CONFIG_PM_SLEEP */ #if defined(DHDTHREAD) && defined(RXFRAME_THREAD) /* Request scheduling of the bus rx frame */ @@ -679,7 +745,11 @@ static inline int dhd_rxf_enqueue(dhd_pub_t *dhdp, void* skb) dhd_os_rxfunlock(dhdp); DHD_ERROR(("dhd_rxf_enqueue: pktbuf not consumed %p, store idx %d sent idx %d\n", skb, store_idx, sent_idx)); +#if defined(WAIT_DEQUEUE) OSL_SLEEP(1); +#else + msleep(1); +#endif return BCME_ERROR; } DHD_TRACE(("dhd_rxf_enqueue: Store SKB %p. idx %d -> %d\n", @@ -722,28 +792,6 @@ static inline void* dhd_rxf_dequeue(dhd_pub_t *dhdp) } #endif /* defined(DHDTHREAD) && defined(RXFRAME_THREAD) */ -#if defined(PKT_FILTER_SUPPORT) && !defined(GAN_LITE_NAT_KEEPALIVE_FILTER) -static bool -_turn_on_arp_filter(dhd_pub_t *dhd, int op_mode) -{ - bool _apply = FALSE; - /* In case of IBSS mode, apply arp pkt filter */ - if (op_mode & DHD_FLAG_IBSS_MODE) { - _apply = TRUE; - goto exit; - } - /* In case of P2P GO or GC, apply pkt filter to pass arp pkt to host */ - if ((dhd->arp_version == 1) && - (op_mode & (DHD_FLAG_P2P_GC_MODE | DHD_FLAG_P2P_GO_MODE))) { - _apply = TRUE; - goto exit; - } - -exit: - return _apply; -} -#endif /* PKT_FILTER_SUPPORT && !GAN_LITE_NAT_KEEPALIVE_FILTER */ - static int dhd_process_cid_mac(dhd_pub_t *dhdp, bool prepost) { dhd_info_t *dhd = (dhd_info_t *)dhdp->info; @@ -784,6 +832,28 @@ static int dhd_process_cid_mac(dhd_pub_t *dhdp, bool prepost) return 0; } +#if defined(PKT_FILTER_SUPPORT) && !defined(GAN_LITE_NAT_KEEPALIVE_FILTER) +static bool +_turn_on_arp_filter(dhd_pub_t *dhd, int op_mode) +{ + bool _apply = FALSE; + /* In case of IBSS mode, apply arp pkt filter */ + if (op_mode & DHD_FLAG_IBSS_MODE) { + _apply = TRUE; + goto exit; + } + /* In case of P2P GO or GC, apply pkt filter to pass arp pkt to host */ + if ((dhd->arp_version == 1) && + (op_mode & (DHD_FLAG_P2P_GC_MODE | DHD_FLAG_P2P_GO_MODE))) { + _apply = TRUE; + goto exit; + } + +exit: + return _apply; +} +#endif /* PKT_FILTER_SUPPORT && !GAN_LITE_NAT_KEEPALIVE_FILTER */ + void dhd_set_packet_filter(dhd_pub_t *dhd) { #ifdef PKT_FILTER_SUPPORT @@ -813,7 +883,7 @@ void dhd_enable_packet_filter(int value, dhd_pub_t *dhd) #ifndef GAN_LITE_NAT_KEEPALIVE_FILTER if (value && (i == DHD_ARP_FILTER_NUM) && !_turn_on_arp_filter(dhd, dhd->op_mode)) { - DHD_TRACE_HW4(("Do not turn on ARP white list pkt filter:" + DHD_TRACE(("Do not turn on ARP white list pkt filter:" "val %d, cnt %d, op_mode 0x%x\n", value, i, dhd->op_mode)); continue; @@ -840,6 +910,8 @@ static int dhd_set_suspend(int value, dhd_pub_t *dhd) #if defined(CUSTOMER_HW4) && defined(ENABLE_BCN_LI_BCN_WAKEUP) int bcn_li_bcn; #endif /* CUSTOMER_HW4 && ENABLE_BCN_LI_BCN_WAKEUP */ + uint nd_ra_filter = 0; + int ret = 0; #if defined(PASS_ALL_MCAST_PKTS) && defined(CUSTOMER_HW4) struct dhd_info *dhdinfo = dhd->info; uint32 allmulti; @@ -903,6 +975,16 @@ static int dhd_set_suspend(int value, dhd_pub_t *dhd) 4, iovbuf, sizeof(iovbuf)); dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); #endif /* CUSTOMER_HW4 && ENABLE_BCN_LI_BCN_WAKEUP */ + if (FW_SUPPORTED(dhd, ndoe)) { + /* enable IPv6 RA filter in firmware during suspend */ + nd_ra_filter = 1; + bcm_mkiovar("nd_ra_filter_enable", (char *)&nd_ra_filter, 4, + iovbuf, sizeof(iovbuf)); + if ((ret = dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, + sizeof(iovbuf), TRUE, 0)) < 0) + DHD_ERROR(("failed to set nd_ra_filter (%d)\n", + ret)); + } } else { #ifdef PKT_FILTER_SUPPORT dhd->early_suspended = 0; @@ -947,6 +1029,16 @@ static int dhd_set_suspend(int value, dhd_pub_t *dhd) 4, iovbuf, sizeof(iovbuf)); dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); #endif /* CUSTOMER_HW4 && ENABLE_BCN_LI_BCN_WAKEUP */ + if (FW_SUPPORTED(dhd, ndoe)) { + /* disable IPv6 RA filter in firmware during suspend */ + nd_ra_filter = 0; + bcm_mkiovar("nd_ra_filter_enable", (char *)&nd_ra_filter, 4, + iovbuf, sizeof(iovbuf)); + if ((ret = dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, + sizeof(iovbuf), TRUE, 0)) < 0) + DHD_ERROR(("failed to set nd_ra_filter (%d)\n", + ret)); + } } } dhd_suspend_unlock(dhd); @@ -1054,7 +1146,7 @@ dhd_net2idx(dhd_info_t *dhd, struct net_device *net) ASSERT(dhd); while (i < DHD_MAX_IFS) { - if (dhd->iflist[i] && (dhd->iflist[i]->net == net)) + if (dhd->iflist[i] && dhd->iflist[i]->net && (dhd->iflist[i]->net == net)) return i; i++; } @@ -1502,7 +1594,6 @@ dhd_op_if(dhd_if_t *ifp) } } - #ifdef DHDTCPACK_SUPPRESS uint dhd_use_tcpack_suppress = TRUE; module_param(dhd_use_tcpack_suppress, uint, FALSE); @@ -1514,9 +1605,8 @@ _dhd_sysioc_thread(void *data) { tsk_ctl_t *tsk = (tsk_ctl_t *)data; dhd_info_t *dhd = (dhd_info_t *)tsk->parent; - - - int i; + struct ipv6_addr *iter, *next; + int i, ret; #ifdef SOFTAP bool in_ap = FALSE; unsigned long flags; @@ -1577,6 +1667,35 @@ _dhd_sysioc_thread(void *data) #endif /* MCAST_LIST_ACCUMULATION */ } + list_for_each_entry_safe(iter, next, + &dhd->iflist[i]->ipv6_list, list) { + spin_lock_bh(&dhd->iflist[i]->ipv6_lock); + list_del(&iter->list); + spin_unlock_bh(&dhd->iflist[i]->ipv6_lock); + if (iter->ipv6_oper == DHD_IPV6_ADDR_ADD) { + ret = dhd_ndo_enable(&dhd->pub, TRUE); + if (ret < 0) { + DHD_ERROR(("%s: Enabling NDO Failed %d\n", + __FUNCTION__, ret)); + continue; + } + ret = dhd_ndo_add_ip(&dhd->pub, + (char*)&iter->ipv6_addr[0], i); + if (ret < 0) { + DHD_ERROR(("%s: Adding host ip fail %d\n", + __FUNCTION__, ret)); + continue; + } + } else { + ret = dhd_ndo_remove_ip(&dhd->pub, i); + if (ret < 0) { + DHD_ERROR(("%s: Removing host ip fail %d\n", + __FUNCTION__, ret)); + continue; + } + } + NATIVE_MFREE(dhd->pub.osh, iter, sizeof(struct ipv6_addr)); + } if (dhd->set_macaddress == i+1) { dhd->set_macaddress = 0; if (_dhd_set_mac_address(dhd, i, &dhd->macvalue) == 0) { @@ -1728,22 +1847,21 @@ dhd_sendpkt(dhd_pub_t *dhdp, int ifidx, void *pktbuf) #endif /* DHDTCPACK_SUPPRESS */ #ifdef PROP_TXSTATUS { - dhd_os_wlfc_block(dhdp); - if (dhdp->wlfc_state && - ((athost_wl_status_info_t*)dhdp->wlfc_state)->proptxstatus_mode - != WLFC_FCMODE_NONE) { - dhd_wlfc_commit_packets(dhdp->wlfc_state, (f_commitpkt_t)dhd_bus_txdata, - dhdp->bus, pktbuf); - if (((athost_wl_status_info_t*)dhdp->wlfc_state)->toggle_host_if) { - ((athost_wl_status_info_t*)dhdp->wlfc_state)->toggle_host_if = 0; - } - dhd_os_wlfc_unblock(dhdp); - } - else { - dhd_os_wlfc_unblock(dhdp); - /* non-proptxstatus way */ - ret = dhd_bus_txdata(dhdp->bus, pktbuf); + dhd_os_wlfc_block(dhdp); + if (dhdp->wlfc_state && ((athost_wl_status_info_t*)dhdp->wlfc_state)->proptxstatus_mode + != WLFC_FCMODE_NONE) { + dhd_wlfc_commit_packets(dhdp->wlfc_state, (f_commitpkt_t)dhd_bus_txdata, + dhdp->bus, pktbuf); + if (((athost_wl_status_info_t*)dhdp->wlfc_state)->toggle_host_if) { + ((athost_wl_status_info_t*)dhdp->wlfc_state)->toggle_host_if = 0; } + dhd_os_wlfc_unblock(dhdp); + } + else { + dhd_os_wlfc_unblock(dhdp); + /* non-proptxstatus way */ + ret = dhd_bus_txdata(dhdp->bus, pktbuf); + } } #else ret = dhd_bus_txdata(dhdp->bus, pktbuf); @@ -1756,8 +1874,10 @@ int dhd_start_xmit(struct sk_buff *skb, struct net_device *net) { int ret; + uint datalen; void *pktbuf; - dhd_info_t *dhd = *(dhd_info_t **)netdev_priv(net); + dhd_info_t *dhd = *(dhd_info_t **)netdev_priv(net); + dhd_if_t *ifp = NULL; int ifidx; #ifdef WLMEDIA_HTSF uint8 htsfdlystat_sz = dhd->pub.htsfdlystat_sz; @@ -1799,6 +1919,9 @@ dhd_start_xmit(struct sk_buff *skb, struct net_device *net) #endif } + ifp = dhd->iflist[ifidx]; + datalen = PKTLEN(dhdp->osh, skb); + /* Make sure there's enough room for any header */ if (skb_headroom(skb) < dhd->pub.hdrlen + htsfdlystat_sz) { @@ -1841,12 +1964,15 @@ dhd_start_xmit(struct sk_buff *skb, struct net_device *net) ret = dhd_sendpkt(&dhd->pub, ifidx, pktbuf); - done: - if (ret) - dhd->pub.dstats.tx_dropped++; - else - dhd->pub.tx_packets++; + if (ret) { + ifp->stats.tx_dropped++; + } + else { + dhd->pub.tx_packets++; + ifp->stats.tx_packets++; + ifp->stats.tx_bytes += datalen; + } DHD_OS_WAKE_UNLOCK(&dhd->pub); @@ -1948,8 +2074,8 @@ dhd_rx_frame(dhd_pub_t *dhdp, int ifidx, void *pktbuf, int numpkt, uint8 chan) DHD_TRACE(("%s: Enter\n", __FUNCTION__)); for (i = 0; pktbuf && i < numpkt; i++, pktbuf = pnext) { -#ifdef WLBTAMP struct ether_header *eh; +#ifdef WLBTAMP struct dot11_llc_snap_header *lsh; #endif @@ -1964,11 +2090,14 @@ dhd_rx_frame(dhd_pub_t *dhdp, int ifidx, void *pktbuf, int numpkt, uint8 chan) continue; } #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0) - /* Dropping packets before registering net device to avoid kernel panic */ + /* Dropping only data packets before registering net device to avoid kernel panic */ + eh = (struct ether_header *)PKTDATA(wl->sh.osh, pktbuf); #ifndef PROP_TXSTATUS_VSDB - if (!ifp->net || ifp->net->reg_state != NETREG_REGISTERED) { + if ((!ifp->net || ifp->net->reg_state != NETREG_REGISTERED) && + (ntoh16(eh->ether_type) != ETHER_TYPE_BRCM)) { #else - if (!ifp->net || ifp->net->reg_state != NETREG_REGISTERED || !dhd->pub.up) { + if ((!ifp->net || ifp->net->reg_state != NETREG_REGISTERED || !dhd->pub.up) && + (ntoh16(eh->ether_type) != ETHER_TYPE_BRCM)) { #endif /* PROP_TXSTATUS_VSDB */ DHD_ERROR(("%s: net device is NOT registered yet. drop packet\n", __FUNCTION__)); @@ -2079,6 +2208,7 @@ dhd_rx_frame(dhd_pub_t *dhdp, int ifidx, void *pktbuf, int numpkt, uint8 chan) skb_pull(skb, ETH_HLEN); /* Process special event packets and then discard them */ + memset(&event, 0, sizeof(event)); if (ntoh16(skb->protocol) == ETHER_TYPE_BRCM) { dhd_wl_host_event(dhd, &ifidx, #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 22) @@ -2089,7 +2219,6 @@ dhd_rx_frame(dhd_pub_t *dhdp, int ifidx, void *pktbuf, int numpkt, uint8 chan) &event, &data); -#if defined(WLBTAMP) || defined(PNO_SUPPORT) wl_event_to_host_order(&event); if (!tout_ctrl) tout_ctrl = DHD_PACKET_TIMEOUT_MS; @@ -2099,16 +2228,19 @@ dhd_rx_frame(dhd_pub_t *dhdp, int ifidx, void *pktbuf, int numpkt, uint8 chan) } #endif /* WLBTAMP */ -#ifdef PNO_SUPPORT +#if defined(PNO_SUPPORT) if (event.event_type == WLC_E_PFN_NET_FOUND) { -#ifdef CUSTOMER_HW4 - tout_ctrl = DHD_PNO_TIMEOUT_MS; -#else - tout_ctrl *= 2; -#endif + /* enforce custom wake lock to garantee that Kernel not suspended */ + tout_ctrl = CUSTOM_PNO_EVENT_LOCK_xTIME * DHD_PACKET_TIMEOUT_MS; } #endif /* PNO_SUPPORT */ -#endif /* defined(WLBTAMP) || defined(PNO_SUPPORT) */ + +#if defined(CUSTOMER_HW4) + if (event.event_type == WLC_E_ESCAN_RESULT) { + PKTFREE(dhdp->osh, pktbuf, TRUE); + continue; + } +#endif } else { tout_rx = DHD_PACKET_TIMEOUT_MS; } @@ -2122,7 +2254,8 @@ dhd_rx_frame(dhd_pub_t *dhdp, int ifidx, void *pktbuf, int numpkt, uint8 chan) dhdp->dstats.rx_bytes += skb->len; dhdp->rx_packets++; /* Local count */ - + ifp->stats.rx_bytes += skb->len; + ifp->stats.rx_packets++; if (in_interrupt()) { netif_rx(skb); @@ -2272,7 +2405,6 @@ dhd_watchdog_thread(void *data) if (dhd->pub.dongle_reset == FALSE) { DHD_TIMER(("%s:\n", __FUNCTION__)); - /* Call the bus module watchdog */ dhd_bus_watchdog(&dhd->pub); @@ -2330,12 +2462,28 @@ static void dhd_watchdog(ulong data) } #ifdef DHDTHREAD + +#ifdef ENABLE_ADAPTIVE_SCHED +static void +dhd_sched_policy(int prio) +{ + struct sched_param param; + if (cpufreq_quick_get(0) <= CUSTOM_CPUFREQ_THRESH) { + param.sched_priority = 0; + setScheduler(current, SCHED_NORMAL, ¶m); + } else { + param.sched_priority = (prio < MAX_RT_PRIO)? prio : (MAX_RT_PRIO-1); + setScheduler(current, SCHED_FIFO, ¶m); + } +} +#endif /* ENABLE_ADAPTIVE_SCHED */ + + static int dhd_dpc_thread(void *data) { tsk_ctl_t *tsk = (tsk_ctl_t *)data; dhd_info_t *dhd = (dhd_info_t *)tsk->parent; - /* This thread doesn't need any user-level access, * so get rid of all our resources */ @@ -2352,12 +2500,15 @@ dhd_dpc_thread(void *data) set_cpus_allowed_ptr(current, cpumask_of(1)); else #endif /* CUSTOMER_HW4 && CONFIG_MACH_UNIVERSAL5410 */ - set_cpus_allowed_ptr(current, cpumask_of(CUSTOM_DPC_CPUCORE)); + set_cpus_allowed_ptr(current, cpumask_of(CUSTOM_DPC_CPUCORE)); #endif /* CUSTOM_DPC_CPUCORE */ /* Run until signal received */ while (1) { if (!binary_sema_down(tsk)) { +#ifdef ENABLE_ADAPTIVE_SCHED + dhd_sched_policy(dhd_dpc_prio); +#endif /* ENABLE_ADAPTIVE_SCHED */ SMP_RD_BARRIER_DEPENDS(); if (tsk->terminated) { break; @@ -2368,6 +2519,7 @@ dhd_dpc_thread(void *data) #if defined(CUSTOMER_HW4) int resched_cnt = 0; #endif /* CUSTOMER_HW4 */ + dhd_os_wd_timer_extend(&dhd->pub, TRUE); while (dhd_bus_dpc(dhd->pub.bus)) { /* process all data */ #if defined(CUSTOMER_HW4) @@ -2382,6 +2534,7 @@ dhd_dpc_thread(void *data) } #endif /* CUSTOMER_HW4 */ } + dhd_os_wd_timer_extend(&dhd->pub, FALSE); DHD_OS_WAKE_UNLOCK(&dhd->pub); } else { if (dhd->pub.up) @@ -2403,6 +2556,10 @@ dhd_rxf_thread(void *data) tsk_ctl_t *tsk = (tsk_ctl_t *)data; dhd_info_t *dhd = (dhd_info_t *)tsk->parent; dhd_pub_t *pub = &dhd->pub; +#if defined(WAIT_DEQUEUE) +#define RXF_WATCHDOG_TIME 250 /* BARK_TIME(1000) / */ + ulong watchdogTime = OSL_SYSUPTIME(); /* msec */ +#endif /* This thread doesn't need any user-level access, * so get rid of all our resources @@ -2427,6 +2584,9 @@ dhd_rxf_thread(void *data) #if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 0) ulong flags; #endif +#ifdef ENABLE_ADAPTIVE_SCHED + dhd_sched_policy(dhd_rxf_prio); +#endif /* ENABLE_ADAPTIVE_SCHED */ SMP_RD_BARRIER_DEPENDS(); @@ -2438,7 +2598,6 @@ dhd_rxf_thread(void *data) if (skb == NULL) { continue; } - while (skb) { void *skbnext = PKTNEXT(pub->osh, skb); PKTSETNEXT(pub->osh, skb, NULL); @@ -2454,7 +2613,12 @@ dhd_rxf_thread(void *data) #endif skb = skbnext; } - +#if defined(WAIT_DEQUEUE) + if (OSL_SYSUPTIME() - watchdogTime > RXF_WATCHDOG_TIME) { + OSL_SLEEP(1); + watchdogTime = OSL_SYSUPTIME(); + } +#endif DHD_OS_WAKE_UNLOCK(pub); } else @@ -2792,7 +2956,7 @@ int dhd_ioctl_process(dhd_pub_t *pub, int ifidx, dhd_ioctl_t *ioc) } else { */ { - if (!(buf = (char*)MALLOC(pub->osh, buflen))) { + if (!(buf = MALLOC(pub->osh, buflen + 1))) { bcmerror = BCME_NOMEM; goto done; } @@ -2800,6 +2964,7 @@ int dhd_ioctl_process(dhd_pub_t *pub, int ifidx, dhd_ioctl_t *ioc) bcmerror = BCME_BADADDR; goto done; } + *(char *)(buf + buflen) = '\0'; } } @@ -2907,7 +3072,7 @@ int dhd_ioctl_process(dhd_pub_t *pub, int ifidx, dhd_ioctl_t *ioc) } if (buf) - MFREE(pub->osh, buf, buflen); + MFREE(pub->osh, buf, buflen + 1); return bcmerror; } @@ -2940,7 +3105,7 @@ dhd_ioctl_entry(struct net_device *net, struct ifreq *ifr, int cmd) return -1; } -#if defined(CONFIG_WIRELESS_EXT) +#if defined(WL_WIRELESS_EXT) /* linux wireless extensions */ if ((cmd >= SIOCIWFIRST) && (cmd <= SIOCIWLAST)) { /* may recurse, do NOT lock */ @@ -2948,7 +3113,7 @@ dhd_ioctl_entry(struct net_device *net, struct ifreq *ifr, int cmd) DHD_OS_WAKE_UNLOCK(&dhd->pub); return ret; } -#endif /* defined(CONFIG_WIRELESS_EXT) */ +#endif /* defined(WL_WIRELESS_EXT) */ #if LINUX_VERSION_CODE > KERNEL_VERSION(2, 4, 2) if (cmd == SIOCETHTOOL) { @@ -3040,13 +3205,6 @@ dhd_cleanup_virt_ifaces(dhd_info_t *dhd) } #endif /* WL_CFG80211 */ -#if defined(WL_CFG80211) && defined(SUPPORT_DEEP_SLEEP) -/* Flags to indicate if we distingish power off policy when - * user set the memu "Keep Wi-Fi on during sleep" to "Never" - */ -int trigger_deep_sleep = 0; -#endif /* WL_CFG80211 && SUPPORT_DEEP_SLEEP */ - #ifdef CUSTOMER_HW4 #ifdef FIX_CPU_MIN_CLOCK static int dhd_init_cpufreq_fix(dhd_info_t *dhd) @@ -3113,14 +3271,6 @@ dhd_stop(struct net_device *net) DHD_OS_WAKE_LOCK(&dhd->pub); DHD_TRACE(("%s: Enter %p\n", __FUNCTION__, net)); -#ifdef FIX_CPU_MIN_CLOCK - dhd_cpu_unlock(dhd); -#endif /* FIX_CPU_MIN_CLOCK */ - - if (dhd->pub.up == 0) { - goto exit; - } - #ifdef CUSTOMER_HW4 #ifdef FIX_CPU_MIN_CLOCK if (strstr(fw_path, "_apsta")) @@ -3128,6 +3278,9 @@ dhd_stop(struct net_device *net) #endif /* FIX_CPU_MIN_CLOCK */ #endif /* CUSTOMER_HW4 */ + if (dhd->pub.up == 0) { + goto exit; + } ifidx = dhd_net2idx(dhd, net); BCM_REFERENCE(ifidx); @@ -3153,7 +3306,9 @@ dhd_stop(struct net_device *net) #endif #ifdef PROP_TXSTATUS + dhd_os_wlfc_block(&dhd->pub); dhd_wlfc_cleanup(&dhd->pub, NULL, 0); + dhd_os_wlfc_unblock(&dhd->pub); #endif /* Stop the protocol module */ dhd_prot_stop(&dhd->pub); @@ -3165,11 +3320,18 @@ dhd_stop(struct net_device *net) wl_android_wifi_off(net); #ifdef SUPPORT_DEEP_SLEEP else { - /* CSP#505233: Flags to indicate if we distingish - * power off policy when user set the memu - * "Keep Wi-Fi on during sleep" to "Never" + /* trigger_deep_sleep: indicate if we distingish + * power off policy when user selects + * "Keep Wi-Fi on during sleep" (one of items in + * the Android Wi-Fi Advanced Settings) to "Never" + * + * use_deepsleep_onoff: indicate that the Wi-Fi on + * and off operation is controlled by deepsleep + * + * is_deepsleep_on: indicate current deepsleep status */ - if (trigger_deep_sleep) { + if ((trigger_deep_sleep || use_deepsleep_onoff) && + !is_deepsleep_on) { dhd_deepsleep(net, 1); trigger_deep_sleep = 0; } @@ -3183,6 +3345,12 @@ dhd_stop(struct net_device *net) return 0; } +#if defined(WL_CFG80211) && defined(SUPPORT_DEEP_SLEEP) && \ + (defined(USE_INITIAL_2G_SCAN) || defined(USE_INITIAL_SHORT_DWELL_TIME)) +extern bool g_first_broadcast_scan; +#endif /* OEM_ANDROID && WL_CFG80211 && SUPPORT_DEEP_SLEEP && */ +/* (USE_INITIAL_2G_SCAN || USE_INITIAL_SHORT_DWELL_TIME) */ + static int dhd_open(struct net_device *net) { @@ -3208,21 +3376,15 @@ dhd_open(struct net_device *net) } } #endif /* CUSTOMER_HW4 */ + +#if defined(MULTIPLE_SUPPLICANT) #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25)) && 1 && 1 if (mutex_is_locked(&_dhd_sdio_mutex_lock_) != 0) { DHD_ERROR(("%s : dhd_open: call dev open before insmod complete!\n", __FUNCTION__)); } mutex_lock(&_dhd_sdio_mutex_lock_); #endif - -#ifdef CUSTOMER_HW4 -#ifdef FIX_CPU_MIN_CLOCK - if (strstr(fw_path, "_apsta")) { - dhd_init_cpufreq_fix(dhd); - dhd_fix_cpu_freq(dhd); - } -#endif /* FIX_CPU_MIN_CLOCK */ -#endif /* CUSTOMER_HW4 */ +#endif /* MULTIPLE_SUPPLICANT */ DHD_OS_WAKE_LOCK(&dhd->pub); /* Update FW path if it was changed */ @@ -3244,17 +3406,14 @@ dhd_open(struct net_device *net) } #endif /* CUSTOMER_HW4 */ -#if defined(CUSTOMER_HW4) && defined(SUPPORT_MULTIPLE_REVISION) - /* dhd_open() can be call several times when loading failed */ - if (strlen(firmware_path) != 0) { - ret = concate_revision(dhd->pub.bus, fw_path, MOD_PARAM_PATHLEN, - nv_path, MOD_PARAM_PATHLEN); - if (ret != 0) { - DHD_ERROR(("%s: fail to concatnate revison \n", __FUNCTION__)); - goto exit; - } +#ifdef CUSTOMER_HW4 +#ifdef FIX_CPU_MIN_CLOCK + if (strstr(fw_path, "_apsta")) { + dhd_init_cpufreq_fix(dhd); + dhd_fix_cpu_freq(dhd); } -#endif /* CUSTOMER_HW4 && SUPPORT_MULTIPLE_REVISION */ +#endif /* FIX_CPU_MIN_CLOCK */ +#endif /* CUSTOMER_HW4 */ dhd->pub.dongle_trap_occured = 0; dhd->pub.hang_was_sent = 0; @@ -3293,6 +3452,9 @@ dhd_open(struct net_device *net) #if defined(WL_CFG80211) DHD_ERROR(("\n%s\n", dhd_version)); if (!dhd_download_fw_on_driverload) { + /* update firmware and nvram path to SDIO bus */ + dhd_bus_update_fw_nv_path(dhd->pub.bus, + fw_path, nv_path); ret = wl_android_wifi_on(net); if (ret != 0) { DHD_ERROR(("%s : wl_android_wifi_on failed (%d)\n", @@ -3303,11 +3465,21 @@ dhd_open(struct net_device *net) } #ifdef SUPPORT_DEEP_SLEEP else { - /* Flags to indicate if we distingish - * power off policy when user set the memu - * "Keep Wi-Fi on during sleep" to "Never" + /* trigger_deep_sleep: indicate if we distingish + * power off policy when user selects + * "Keep Wi-Fi on during sleep" (one of items in + * the Android Wi-Fi Advanced Settings) to "Never" + * + * use_deepsleep_onoff: indicate that the Wi-Fi on + * and off operation is controlled by deepsleep + * + * is_deepsleep_on: indicate current deepsleep status */ - if (trigger_deep_sleep) { + if ((trigger_deep_sleep || use_deepsleep_onoff) && + is_deepsleep_on) { +#if defined(USE_INITIAL_2G_SCAN) || defined(USE_INITIAL_SHORT_DWELL_TIME) + g_first_broadcast_scan = TRUE; +#endif /* USE_INITIAL_2G_SCAN || USE_INITIAL_SHORT_DWELL_TIME */ dhd_deepsleep(net, 0); trigger_deep_sleep = 0; } @@ -3361,9 +3533,11 @@ dhd_open(struct net_device *net) DHD_OS_WAKE_UNLOCK(&dhd->pub); +#if defined(MULTIPLE_SUPPLICANT) #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25)) && 1 && 1 mutex_unlock(&_dhd_sdio_mutex_lock_); #endif +#endif /* MULTIPLE_SUPPLICANT */ return ret; } @@ -3377,14 +3551,15 @@ int dhd_do_driver_init(struct net_device *net) return -EINVAL; } -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25)) && 1 && 1 #ifdef MULTIPLE_SUPPLICANT +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25)) && 1 && 1 if (mutex_is_locked(&_dhd_sdio_mutex_lock_) != 0) { DHD_ERROR(("%s : dhdsdio_probe is already running!\n", __FUNCTION__)); return 0; } -#endif #endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25)) */ +#endif /* MULTIPLE_SUPPLICANT */ + /* && defined(OEM_ANDROID) && defined(BCMSDIO) */ dhd = *(dhd_info_t **)netdev_priv(net); @@ -3454,6 +3629,8 @@ dhd_add_if(dhd_info_t *dhd, int ifidx, void *handle, char *name, dhd->iflist[ifidx] = ifp; strncpy(ifp->name, name, IFNAMSIZ); ifp->name[IFNAMSIZ] = '\0'; + INIT_LIST_HEAD(&ifp->ipv6_list); + spin_lock_init(&ifp->ipv6_lock); if (mac_addr != NULL) memcpy(&ifp->mac_addr, mac_addr, ETHER_ADDR_LEN); @@ -3539,14 +3716,6 @@ dhd_attach(osl_t *osh, struct dhd_bus *bus, uint bus_hdrlen) bzero(nv_path, MOD_PARAM_PATHLEN); strncpy(nv_path, nvram_path, sizeof(nv_path) -1); } -#if defined(CUSTOMER_HW4) && defined(SUPPORT_MULTIPLE_REVISION) - if (strlen(fw_path) != 0 && - concate_revision(bus, fw_path, MOD_PARAM_PATHLEN, - nv_path, MOD_PARAM_PATHLEN) != 0) { - DHD_ERROR(("%s: fail to concatnate revison \n", __FUNCTION__)); - goto fail; - } -#endif /* CUSTOMER_HW4 && SUPPORT_MULTIPLE_REVISION */ /* Allocate etherdev, including space for private structure */ if (!(net = alloc_etherdev(sizeof(dhd)))) { @@ -3561,10 +3730,10 @@ dhd_attach(osl_t *osh, struct dhd_bus *bus, uint bus_hdrlen) if (!dhd) { DHD_INFO(("%s: OOM - Pre-alloc dhd_info\n", __FUNCTION__)); #endif /* CONFIG_DHD_USE_STATIC_BUF */ - if (!(dhd = MALLOC(osh, sizeof(dhd_info_t)))) { - DHD_ERROR(("%s: OOM - alloc dhd_info\n", __FUNCTION__)); - goto fail; - } + if (!(dhd = MALLOC(osh, sizeof(dhd_info_t)))) { + DHD_ERROR(("%s: OOM - alloc dhd_info\n", __FUNCTION__)); + goto fail; + } #if defined(CONFIG_DHD_USE_STATIC_BUF) } #endif /* CONFIG_DHD_USE_STATIC_BUF */ @@ -3624,6 +3793,10 @@ dhd_attach(osl_t *osh, struct dhd_bus *bus, uint bus_hdrlen) else dhd->pub.wlfc_enabled = FALSE; #endif /* PROP_TXSTATUS_VSDB */ + dhd->pub.ptx_opt_enabled = FALSE; + dhd->pub.skip_fc = dhd_wlfc_skip_fc; + dhd->pub.plat_enable = dhd_wlfc_plat_enable; + dhd->pub.plat_deinit = dhd_wlfc_plat_deinit; #endif /* PROP_TXSTATUS */ /* Initialize other structure content */ @@ -3648,18 +3821,10 @@ dhd_attach(osl_t *osh, struct dhd_bus *bus, uint bus_hdrlen) dhd->wakelock_rx_timeout_enable = 0; dhd->wakelock_ctrl_timeout_enable = 0; #ifdef CONFIG_HAS_WAKELOCK - dhd->wl_wifi = MALLOC(osh, sizeof(struct wake_lock)); - dhd->wl_rxwake = MALLOC(osh, sizeof(struct wake_lock)); - dhd->wl_ctrlwake = MALLOC(osh, sizeof(struct wake_lock)); - dhd->wl_wdwake = MALLOC(osh, sizeof(struct wake_lock)); - if (!dhd->wl_wifi || !dhd->wl_rxwake || !dhd->wl_ctrlwake || !dhd->wl_wdwake) { - DHD_ERROR(("%s: mem alloc for wake lock failed\n", __FUNCTION__)); - goto fail; - } - wake_lock_init(dhd->wl_wifi, WAKE_LOCK_SUSPEND, "wlan_wake"); - wake_lock_init(dhd->wl_rxwake, WAKE_LOCK_SUSPEND, "wlan_rx_wake"); - wake_lock_init(dhd->wl_ctrlwake, WAKE_LOCK_SUSPEND, "wlan_ctrl_wake"); - wake_lock_init(dhd->wl_wdwake, WAKE_LOCK_SUSPEND, "wlan_wd_wake"); + wake_lock_init(&dhd->wl_wifi, WAKE_LOCK_SUSPEND, "wlan_wake"); + wake_lock_init(&dhd->wl_rxwake, WAKE_LOCK_SUSPEND, "wlan_rx_wake"); + wake_lock_init(&dhd->wl_ctrlwake, WAKE_LOCK_SUSPEND, "wlan_ctrl_wake"); + wake_lock_init(&dhd->wl_wdwake, WAKE_LOCK_SUSPEND, "wlan_wd_wake"); #endif /* CONFIG_HAS_WAKELOCK */ #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25)) && 1 mutex_init(&dhd->dhd_net_if_mutex); @@ -3684,7 +3849,7 @@ dhd_attach(osl_t *osh, struct dhd_bus *bus, uint bus_hdrlen) dhd_monitor_init(&dhd->pub); dhd_state |= DHD_ATTACH_STATE_CFG80211; #endif -#if defined(CONFIG_WIRELESS_EXT) +#if defined(WL_WIRELESS_EXT) /* Attach and link in the iw */ if (!(dhd_state & DHD_ATTACH_STATE_CFG80211)) { if (wl_iw_attach(net, (void *)&dhd->pub) != 0) { @@ -3693,13 +3858,14 @@ dhd_attach(osl_t *osh, struct dhd_bus *bus, uint bus_hdrlen) } dhd_state |= DHD_ATTACH_STATE_WL_ATTACH; } -#endif /* defined(CONFIG_WIRELESS_EXT) */ +#endif /* defined(WL_WIRELESS_EXT) */ /* Set up the watchdog timer */ init_timer(&dhd->timer); dhd->timer.data = (ulong)dhd; dhd->timer.function = dhd_watchdog; + dhd->default_wd_interval = dhd_watchdog_ms; #ifdef DHDTHREAD /* Initialize thread based operation and lock */ @@ -3755,10 +3921,11 @@ dhd_attach(osl_t *osh, struct dhd_bus *bus, uint bus_hdrlen) */ memcpy(netdev_priv(net), &dhd, sizeof(dhd)); -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) && (LINUX_VERSION_CODE <= \ - KERNEL_VERSION(2, 6, 39)) && defined(CONFIG_PM_SLEEP) - register_pm_notifier(&dhd_sleep_pm_notifier); -#endif /* LINUX_VERSION >= 2.6.27 && LINUX_VERSION <= 2.6.39 && CONFIG_PM_SLEEP */ +#if defined(CONFIG_PM_SLEEP) + dhd->pm_notifier.notifier_call = dhd_sleep_pm_callback; + dhd->pm_notifier.priority = 10; + register_pm_notifier(&dhd->pm_notifier); +#endif /* CONFIG_PM_SLEEP */ #if defined(CONFIG_HAS_EARLYSUSPEND) && defined(DHD_USE_EARLYSUSPEND) dhd->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + 20; @@ -3772,6 +3939,7 @@ dhd_attach(osl_t *osh, struct dhd_bus *bus, uint bus_hdrlen) dhd->pend_ipaddr = 0; register_inetaddr_notifier(&dhd_notifier); #endif /* ARP_OFFLOAD_SUPPORT */ + register_inet6addr_notifier(&dhd_notifier_ipv6); #ifdef DHDTCPACK_SUPPRESS dhd->pub.tcp_ack_info_cnt = 0; @@ -3815,8 +3983,7 @@ dhd_bus_start(dhd_pub_t *dhdp) /* try to download image and nvram to the dongle */ if ((dhd->pub.busstate == DHD_BUS_DOWN) && - (fw_path[0] != '\0') && - (nv_path[0] != '\0')) { + (fw_path[0] != '\0') && (nv_path[0] != '\0')) { #ifdef SHOW_NVRAM_TYPE { /* Show nvram type in the kernel log */ int i; @@ -3888,10 +4055,8 @@ dhd_bus_start(dhd_pub_t *dhdp) return -ENODEV; } -#ifndef BCMSPI_ANDROID /* Enable oob at firmware */ dhd_enable_oob_intr(dhd->pub.bus, TRUE); -#endif /* !BCMSPI_ANDROID */ #endif /* defined(OOB_INTR_ONLY) || defined(BCMSPI_ANDROID) */ /* If bus is not ready, can't come up */ @@ -3933,6 +4098,75 @@ dhd_bus_start(dhd_pub_t *dhdp) return 0; } +#ifdef WLTDLS +int _dhd_tdls_enable(dhd_pub_t *dhd, bool tdls_on, bool auto_on, struct ether_addr *mac) +{ + char iovbuf[WLC_IOCTL_SMLEN]; + uint32 tdls = tdls_on; + int ret = 0; + uint32 tdls_auto_op = 0; + uint32 tdls_idle_time = CUSTOM_TDLS_IDLE_MODE_SETTING; + int32 tdls_rssi_high = CUSTOM_TDLS_RSSI_THRESHOLD_HIGH; + int32 tdls_rssi_low = CUSTOM_TDLS_RSSI_THRESHOLD_LOW; + BCM_REFERENCE(mac); + if (!FW_SUPPORTED(dhd, tdls)) + return BCME_ERROR; + + if (dhd->tdls_enable == tdls_on) + goto auto_mode; + bcm_mkiovar("tdls_enable", (char *)&tdls, sizeof(tdls), iovbuf, sizeof(iovbuf)); + if ((ret = dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0)) < 0) { + DHD_ERROR(("%s: tdls %d failed %d\n", __FUNCTION__, tdls, ret)); + goto exit; + } + dhd->tdls_enable = tdls_on; +auto_mode: + + tdls_auto_op = auto_on; + bcm_mkiovar("tdls_auto_op", (char *)&tdls_auto_op, sizeof(tdls_auto_op), + iovbuf, sizeof(iovbuf)); + if ((ret = dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, + sizeof(iovbuf), TRUE, 0)) < 0) { + DHD_ERROR(("%s: tdls_auto_op failed %d\n", __FUNCTION__, ret)); + goto exit; + } + + if (tdls_auto_op) { + bcm_mkiovar("tdls_idle_time", (char *)&tdls_idle_time, + sizeof(tdls_idle_time), iovbuf, sizeof(iovbuf)); + if ((ret = dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, + sizeof(iovbuf), TRUE, 0)) < 0) { + DHD_ERROR(("%s: tdls_idle_time failed %d\n", __FUNCTION__, ret)); + goto exit; + } + bcm_mkiovar("tdls_rssi_high", (char *)&tdls_rssi_high, 4, iovbuf, sizeof(iovbuf)); + if ((ret = dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, + sizeof(iovbuf), TRUE, 0)) < 0) { + DHD_ERROR(("%s: tdls_rssi_high failed %d\n", __FUNCTION__, ret)); + goto exit; + } + bcm_mkiovar("tdls_rssi_low", (char *)&tdls_rssi_low, 4, iovbuf, sizeof(iovbuf)); + if ((ret = dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, + sizeof(iovbuf), TRUE, 0)) < 0) { + DHD_ERROR(("%s: tdls_rssi_low failed %d\n", __FUNCTION__, ret)); + goto exit; + } + } + +exit: + return ret; +} +int dhd_tdls_enable(struct net_device *dev, bool tdls_on, bool auto_on, struct ether_addr *mac) +{ + dhd_info_t *dhd = *(dhd_info_t **)netdev_priv(dev); + int ret = 0; + if (dhd) + ret = _dhd_tdls_enable(&dhd->pub, tdls_on, auto_on, mac); + else + ret = BCME_ERROR; + return ret; +} +#endif /* WLTDLS */ bool dhd_is_concurrent_mode(dhd_pub_t *dhd) { @@ -3964,18 +4198,10 @@ dhd_get_concurrent_capabilites(dhd_pub_t *dhd) */ if (dhd->op_mode & DHD_FLAG_HOSTAP_MODE) return 0; - memset(buf, 0, sizeof(buf)); - bcm_mkiovar("cap", 0, 0, buf, sizeof(buf)); - if ((ret = dhd_wl_ioctl_cmd(dhd, WLC_GET_VAR, buf, sizeof(buf), - FALSE, 0)) < 0) { - DHD_ERROR(("%s: Get Capability failed (error=%d)\n", - __FUNCTION__, ret)); - return 0; - } - if (strstr(buf, "vsdb")) { + if (FW_SUPPORTED(dhd, vsdb)) { mchan_supported = TRUE; } - if (strstr(buf, "p2p") == NULL) { + if (!FW_SUPPORTED(dhd, p2p)) { DHD_TRACE(("Chip does not support p2p\n")); return 0; } @@ -3996,14 +4222,15 @@ dhd_get_concurrent_capabilites(dhd_pub_t *dhd) ret = DHD_FLAG_CONCURR_SINGLE_CHAN_MODE; if (mchan_supported) ret |= DHD_FLAG_CONCURR_MULTI_CHAN_MODE; -#if defined(WL_ENABLE_P2P_IF) || defined(CUSTOMER_HW4) +#if defined(WL_ENABLE_P2P_IF) || defined(CUSTOMER_HW4) || \ + defined(WL_CFG80211_P2P_DEV_IF) /* For customer_hw4, although ICS, * we still support concurrent mode */ return ret; #else return 0; -#endif +#endif /* WL_ENABLE_P2P_IF || CUSTOMER_HW4 || WL_CFG80211_P2P_DEV_IF */ } } } @@ -4020,15 +4247,17 @@ dhd_preinit_ioctls(dhd_pub_t *dhd) #if defined(BCMSUP_4WAY_HANDSHAKE) && defined(WLAN_AKM_SUITE_FT_8021X) uint32 sup_wpa = 0; #endif -#ifdef CUSTOM_AMPDU_BA_WSIZE - uint32 ampdu_ba_wsize = CUSTOM_AMPDU_BA_WSIZE; -#endif /* CUSTOM_AMPDU_BA_WSIZE */ +#if defined(CUSTOM_AMPDU_BA_WSIZE) || (defined(WLAIBSS) && \ + defined(CUSTOM_IBSS_AMPDU_BA_WSIZE)) + uint32 ampdu_ba_wsize = 0; +#endif /* CUSTOM_AMPDU_BA_WSIZE ||(WLAIBSS && CUSTOM_IBSS_AMPDU_BA_WSIZE) */ +#ifdef DHD_ENABLE_LPC uint32 lpc = 1; +#endif /* DHD_ENABLE_LPC */ uint power_mode = PM_FAST; uint32 dongle_align = DHD_SDALIGN; uint32 glom = CUSTOM_GLOM_SETTING; -#if (defined(CUSTOMER_HW4) || defined(BOARD_PANDA)) && (defined(VSDB) || \ - defined(ROAM_ENABLE)) +#if defined(CUSTOMER_HW4) && (defined(VSDB) || defined(ROAM_ENABLE)) uint bcn_timeout = 8; #else uint bcn_timeout = 4; @@ -4045,7 +4274,7 @@ dhd_preinit_ioctls(dhd_pub_t *dhd) int scan_passive_time = DHD_SCAN_PASSIVE_TIME; char buf[WLC_IOCTL_SMLEN]; char *ptr; - uint32 listen_interval = LISTEN_INTERVAL; /* Default Listen Interval in Beacons */ + uint32 listen_interval = CUSTOM_LISTEN_INTERVAL; /* Default Listen Interval in Beacons */ #ifdef ROAM_ENABLE uint roamvar = 0; int roam_trigger[2] = {CUSTOM_ROAM_TRIGGER_SETTING, WLC_BAND_ALL}; @@ -4085,19 +4314,11 @@ dhd_preinit_ioctls(dhd_pub_t *dhd) #ifdef BCMCCX uint32 ccx = 1; #endif -#ifdef WLTDLS - uint32 tdls = 1; -#ifdef CUSTOMER_HW4 - uint32 tdls_idle_time = 10000; /* 10sec */ - uint32 tdls_auto_op = 1; - int32 tdls_rssi_high = -80; - int32 tdls_rssi_low = -85; -#endif -#endif /* WLTDLS */ #ifdef DISABLE_11N uint32 nmode = 0; #endif /* DISABLE_11N */ + #if defined(VSDB) && defined(CUSTOMER_HW4) int interference_mode = 3; #endif @@ -4130,6 +4351,9 @@ dhd_preinit_ioctls(dhd_pub_t *dhd) #ifdef PKT_FILTER_SUPPORT dhd_pkt_filter_enable = TRUE; #endif +#ifdef WLTDLS + dhd->tdls_enable = FALSE; +#endif /* WLTDLS */ dhd->suspend_bcn_li_dtim = CUSTOM_SUSPEND_BCN_LI_DTIM; DHD_TRACE(("Enter %s\n", __FUNCTION__)); dhd->op_mode = 0; @@ -4162,7 +4386,15 @@ dhd_preinit_ioctls(dhd_pub_t *dhd) #endif /* GET_CUSTOM_MAC_ENABLE */ DHD_TRACE(("Firmware = %s\n", fw_path)); - + /* get a capabilities from firmware */ + memset(dhd->fw_capabilities, 0, sizeof(dhd->fw_capabilities)); + bcm_mkiovar("cap", 0, 0, dhd->fw_capabilities, sizeof(dhd->fw_capabilities)); + if ((ret = dhd_wl_ioctl_cmd(dhd, WLC_GET_VAR, dhd->fw_capabilities, + sizeof(dhd->fw_capabilities), FALSE, 0)) < 0) { + DHD_ERROR(("%s: Get Capability failed (error=%d)\n", + __FUNCTION__, ret)); + return 0; + } if ((!op_mode && strstr(fw_path, "_apsta") != NULL) || (op_mode == DHD_FLAG_HOSTAP_MODE)) { #ifdef SET_RANDOM_MAC_SOFTAP @@ -4176,8 +4408,8 @@ dhd_preinit_ioctls(dhd_pub_t *dhd) dhd_pkt_filter_enable = FALSE; #endif #ifdef SET_RANDOM_MAC_SOFTAP - srandom32((uint)jiffies); - rand_mac = random32(); + SRANDOM32((uint)jiffies); + rand_mac = RANDOM32(); iovbuf[0] = 0x02; /* locally administered bit */ iovbuf[1] = 0x1A; iovbuf[2] = 0x11; @@ -4215,9 +4447,19 @@ dhd_preinit_ioctls(dhd_pub_t *dhd) dhd_pkt_filter_enable = FALSE; #endif dhd->op_mode = DHD_FLAG_P2P_MODE; - } - else + } else if (op_mode == DHD_FLAG_IBSS_MODE || + (!op_mode && strstr(fw_path, "_ibss") != NULL)) { + dhd->op_mode = DHD_FLAG_IBSS_MODE; +#ifdef PROP_TXSTATUS_VSDB + if (!disable_proptx) { + hostreorder = 1; + dhd->wlfc_enabled = TRUE; + } +#endif /* PROP_TXSTATUS_VSDB */ + } else { dhd->op_mode = DHD_FLAG_STA_MODE; + } + #if !defined(AP) && defined(WLP2P) if ((concurrent_mode = dhd_get_concurrent_capabilites(dhd))) { #if defined(ARP_OFFLOAD_SUPPORT) @@ -4310,29 +4552,35 @@ dhd_preinit_ioctls(dhd_pub_t *dhd) dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); #endif #ifdef WLTDLS - bcm_mkiovar("tdls_enable", (char *)&tdls, 4, iovbuf, sizeof(iovbuf)); - dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); #ifdef CUSTOMER_HW4 - bcm_mkiovar("tdls_auto_op", (char *)&tdls_auto_op, 4, iovbuf, sizeof(iovbuf)); - dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); - - bcm_mkiovar("tdls_idle_time", (char *)&tdls_idle_time, 4, iovbuf, sizeof(iovbuf)); - dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); - - bcm_mkiovar("tdls_rssi_high", (char *)&tdls_rssi_high, 4, iovbuf, sizeof(iovbuf)); - dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); - - bcm_mkiovar("tdls_rssi_low", (char *)&tdls_rssi_low, 4, iovbuf, sizeof(iovbuf)); - dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); -#endif + /* by default TDLS on and auto mode on */ + _dhd_tdls_enable(dhd, true, true, NULL); +#else + /* by default TDLS on and auto mode off */ + _dhd_tdls_enable(dhd, true, false, NULL); +#endif /* CUSTOMER_HW4 */ #endif /* WLTDLS */ +#ifdef DHD_ENABLE_LPC /* Set lpc 1 */ bcm_mkiovar("lpc", (char *)&lpc, 4, iovbuf, sizeof(iovbuf)); if ((ret = dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0)) < 0) { DHD_ERROR(("%s Set lpc failed %d\n", __FUNCTION__, ret)); +#ifdef CUSTOMER_HW4 + if (ret == BCME_NOTDOWN) { + uint wl_down = 1; + ret = dhd_wl_ioctl_cmd(dhd, WLC_DOWN, + (char *)&wl_down, sizeof(wl_down), TRUE, 0); + DHD_ERROR(("%s lpc fail WL_DOWN : %d, lpc = %d\n", __FUNCTION__, ret, lpc)); + + bcm_mkiovar("lpc", (char *)&lpc, 4, iovbuf, sizeof(iovbuf)); + ret = dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); + DHD_ERROR(("%s Set lpc ret --> %d\n", __FUNCTION__, ret)); + } +#endif /* CUSTOMER_HW4 */ } +#endif /* DHD_ENABLE_LPC */ #if defined(CUSTOMER_HW4) && defined(CONFIG_CONTROL_PM) sec_control_pm(dhd, &power_mode); @@ -4403,7 +4651,6 @@ dhd_preinit_ioctls(dhd_pub_t *dhd) DHD_ERROR(("%s Set txbf failed %d\n", __FUNCTION__, ret)); } #endif /* USE_WL_TXBF */ - #ifdef USE_WL_FRAMEBURST #if defined(CUSTOMER_HW4) && defined(USE_WFA_CERT_CONF) frameburst = sec_get_param(dhd, SET_PARAM_FRAMEBURST); @@ -4429,15 +4676,24 @@ dhd_preinit_ioctls(dhd_pub_t *dhd) DHD_ERROR(("%s Set ack_ratio_depth failed %d\n", __FUNCTION__, ret)); } #endif /* DHD_SET_FW_HIGHSPEED */ +#if defined(CUSTOM_AMPDU_BA_WSIZE) || defined(CUSTOM_IBSS_AMPDU_BA_WSIZE) + /* Set ampdu ba wsize to 64 or 16 */ #ifdef CUSTOM_AMPDU_BA_WSIZE - /* Set ampdu ba wsize to 64 */ - bcm_mkiovar("ampdu_ba_wsize", (char *)&du_ba_wsize, 4, iovbuf, sizeof(iovbuf)); - if ((ret = dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, - sizeof(iovbuf), TRUE, 0)) < 0) { - DHD_ERROR(("%s Set ampdu_ba_wsize to %d failed %d\n", - __FUNCTION__, CUSTOM_AMPDU_BA_WSIZE, ret)); + ampdu_ba_wsize = CUSTOM_AMPDU_BA_WSIZE; +#endif +#if defined(WLAIBSS) && defined(CUSTOM_IBSS_AMPDU_BA_WSIZE) + if (dhd->op_mode == DHD_FLAG_IBSS_MODE) + ampdu_ba_wsize = CUSTOM_IBSS_AMPDU_BA_WSIZE; +#endif /* WLAIBSS && CUSTOM_IBSS_AMPDU_BA_WSIZE */ + if (ampdu_ba_wsize != 0) { + bcm_mkiovar("ampdu_ba_wsize", (char *)&du_ba_wsize, 4, iovbuf, sizeof(iovbuf)); + if ((ret = dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, + sizeof(iovbuf), TRUE, 0)) < 0) { + DHD_ERROR(("%s Set ampdu_ba_wsize to %d failed %d\n", + __FUNCTION__, CUSTOM_AMPDU_BA_WSIZE, ret)); + } } -#endif /* CUSTOM_AMPDU_BA_WSIZE */ +#endif /* CUSTOM_AMPDU_BA_WSIZE || CUSTOM_IBSS_AMPDU_BA_WSIZE */ #if defined(BCMSUP_4WAY_HANDSHAKE) && defined(WLAN_AKM_SUITE_FT_8021X) /* Read 4-way handshake requirements. */ bcm_mkiovar("sup_wpa", (char *)&sup_wpa, 4, @@ -4451,6 +4707,20 @@ dhd_preinit_ioctls(dhd_pub_t *dhd) bcm_mkiovar("vht_features", (char *)&vht_features, 4, iovbuf, sizeof(iovbuf)); if ((ret = dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0)) < 0) { DHD_ERROR(("%s vht_features set failed %d\n", __FUNCTION__, ret)); +#ifdef CUSTOMER_HW4 + if (ret == BCME_NOTDOWN) { + uint wl_down = 1; + ret = dhd_wl_ioctl_cmd(dhd, WLC_DOWN, + (char *)&wl_down, sizeof(wl_down), TRUE, 0); + DHD_ERROR(("%s vht_features fail WL_DOWN : %d, vht_features = 0x%x\n", + __FUNCTION__, ret, vht_features)); + + bcm_mkiovar("vht_features", (char *)&vht_features, 4, + iovbuf, sizeof(iovbuf)); + ret = dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); + DHD_ERROR(("%s vht_features set. ret --> %d\n", __FUNCTION__, ret)); + } +#endif /* CUSTOMER_HW4 */ } #endif /* SUPPORT_2G_VHT */ @@ -4498,6 +4768,9 @@ dhd_preinit_ioctls(dhd_pub_t *dhd) #endif /* WLMEDIA_HTSF */ #ifdef PNO_SUPPORT setbit(eventmask, WLC_E_PFN_NET_FOUND); + setbit(eventmask, WLC_E_PFN_BEST_BATCHING); + setbit(eventmask, WLC_E_PFN_BSSID_NET_FOUND); + setbit(eventmask, WLC_E_PFN_BSSID_NET_LOST); #endif /* PNO_SUPPORT */ /* enable dongle roaming event */ setbit(eventmask, WLC_E_ROAM); @@ -4505,6 +4778,9 @@ dhd_preinit_ioctls(dhd_pub_t *dhd) setbit(eventmask, WLC_E_ADDTS_IND); setbit(eventmask, WLC_E_DELTS_IND); #endif /* BCMCCX */ +#ifdef BCMCCX_S69 + setbit(eventmask, WLC_E_CCX_S69_RESP_RX); +#endif #ifdef WLTDLS setbit(eventmask, WLC_E_TDLS_PEER_EVENT); #endif /* WLTDLS */ @@ -4512,8 +4788,6 @@ dhd_preinit_ioctls(dhd_pub_t *dhd) setbit(eventmask, WLC_E_ESCAN_RESULT); if (dhd->op_mode & DHD_FLAG_P2P_MODE) { setbit(eventmask, WLC_E_ACTION_FRAME_RX); - setbit(eventmask, WLC_E_ACTION_FRAME_COMPLETE); - setbit(eventmask, WLC_E_ACTION_FRAME_OFF_CHAN_COMPLETE); setbit(eventmask, WLC_E_P2P_DISC_LISTEN_COMPLETE); } #if defined(CUSTOMER_HW4) && defined(WES_SUPPORT) @@ -4522,6 +4796,9 @@ dhd_preinit_ioctls(dhd_pub_t *dhd) } #endif /* WES_SUPPORT */ #endif /* WL_CFG80211 */ +#ifdef WLAIBSS + setbit(eventmask, WLC_E_AIBSS_TXFAIL); +#endif /* WLAIBSS */ /* Write updated Event mask */ bcm_mkiovar("event_msgs", eventmask, WL_EVENTING_MASK_LEN, iovbuf, sizeof(iovbuf)); @@ -4582,7 +4859,23 @@ dhd_preinit_ioctls(dhd_pub_t *dhd) #else #if defined(PROP_TXSTATUS) && defined(PROP_TXSTATUS_VSDB) bcm_mkiovar("ampdu_hostreorder", (char *)&hostreorder, 4, buf, sizeof(buf)); - dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, buf, sizeof(buf), TRUE, 0); + if ((ret = dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, buf, sizeof(buf), TRUE, 0)) < 0) { + DHD_ERROR(("%s wl ampdu_hostreorder failed %d\n", __FUNCTION__, ret)); +#ifdef CUSTOMER_HW4 + if (ret == BCME_NOTDOWN) { + uint wl_down = 1; + ret = dhd_wl_ioctl_cmd(dhd, WLC_DOWN, (char *)&wl_down, + sizeof(wl_down), TRUE, 0); + DHD_ERROR(("%s ampdu_hostreorder fail WL_DOWN : %d, hostreorder :%d\n", + __FUNCTION__, ret, hostreorder)); + + bcm_mkiovar("ampdu_hostreorder", (char *)&hostreorder, 4, + iovbuf, sizeof(iovbuf)); + ret = dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); + DHD_ERROR(("%s wl ampdu_hostreorder. ret --> %d\n", __FUNCTION__, ret)); + } +#endif /* CUSTOMER_HW4 */ + } #endif #endif /* DISABLE_11N */ @@ -4595,6 +4888,7 @@ dhd_preinit_ioctls(dhd_pub_t *dhd) bcm_mkiovar("bcn_li_bcn", (char *)&bcn_li_bcn, 4, iovbuf, sizeof(iovbuf)); dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); #endif /* CUSTOMER_HW4 && ENABLE_BCN_LI_BCN_WAKEUP */ + /* query for 'ver' to get version info from firmware */ memset(buf, 0, sizeof(buf)); ptr = buf; @@ -4605,6 +4899,7 @@ dhd_preinit_ioctls(dhd_pub_t *dhd) bcmstrtok(&ptr, "\n", 0); /* Print fw version info */ DHD_ERROR(("Firmware version = %s\n", buf)); + dhd_set_version_info(dhd, buf); /* Check and adjust IOCTL response timeout for Manufactring firmware */ if (strstr(buf, MANUFACTRING_FW) != NULL) { @@ -4614,10 +4909,29 @@ dhd_preinit_ioctls(dhd_pub_t *dhd) } } +#ifdef WRITE_WLANINFO + sec_save_wlinfo(buf,EPI_VERSION_STR, nv_path); +#endif + #ifdef BCMSDIOH_TXGLOM if (bcmsdh_glom_enabled()) { dhd_txglom_enable(dhd, TRUE); } +#endif /* BCMSDIOH_TXGLOM */ + +#if defined(PROP_TXSTATUS) +#ifdef PROP_TXSTATUS_VSDB + if (dhd->op_mode == DHD_FLAG_IBSS_MODE) + dhd_wlfc_init(dhd); +#else + dhd_wlfc_init(dhd); +#endif /* PROP_TXSTATUS_VSDB */ +#endif /* PROP_TXSTATUS */ + +#ifdef PNO_SUPPORT + if (!dhd->pno_state) { + dhd_pno_init(dhd); + } #endif done: @@ -4640,7 +4954,7 @@ dhd_iovar(dhd_pub_t *pub, int ifidx, char *name, char *cmd_buf, uint cmd_len, in ioc.cmd = set? WLC_SET_VAR : WLC_GET_VAR; ioc.buf = buf; ioc.len = len; - ioc.set = TRUE; + ioc.set = set; ret = dhd_wl_ioctl(pub, ifidx, &ioc, ioc.buf, ioc.len); if (!set && ret >= 0) @@ -4751,9 +5065,9 @@ static int dhd_device_event(struct notifier_block *this, /* Filter notifications meant for non Broadcom devices */ if ((ifa->ifa_dev->dev->netdev_ops != &dhd_ops_pri) && (ifa->ifa_dev->dev->netdev_ops != &dhd_ops_virt)) { -#ifdef WLP2P +#if defined(WL_ENABLE_P2P_IF) if (!wl_cfgp2p_is_ifops(ifa->ifa_dev->dev->netdev_ops)) -#endif +#endif /* WL_ENABLE_P2P_IF */ return NOTIFY_DONE; } #endif /* LINUX_VERSION_CODE */ @@ -4826,6 +5140,69 @@ static int dhd_device_event(struct notifier_block *this, } #endif /* ARP_OFFLOAD_SUPPORT */ +/* + * Neighbor Discovery Offload: Called when an interface + * is assigned with ipv6 address. + * Handles only primary interface + */ +static int dhd_device_ipv6_event(struct notifier_block *this, + unsigned long event, + void *ptr) +{ + dhd_info_t *dhd; + dhd_pub_t *dhd_pub; + struct ipv6_addr *_ipv6_addr = NULL; + struct inet6_ifaddr *inet6_ifa = ptr; + int idx = 0; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 31)) + /* Filter notifications meant for non Broadcom devices */ + if (inet6_ifa->idev->dev->netdev_ops != &dhd_ops_pri) { + goto exit; + } +#endif /* LINUX_VERSION_CODE */ + + dhd = *(dhd_info_t **)netdev_priv(inet6_ifa->idev->dev); + if (!dhd) + goto exit; + + idx = dhd_net2idx(dhd, inet6_ifa->idev->dev); + if (idx == DHD_BAD_IF) { + DHD_ERROR(("Cannot find ifidx")); + goto exit; + } + dhd_pub = &dhd->pub; + if (!FW_SUPPORTED(dhd_pub, ndoe)) + goto exit; + if (event == NETDEV_UP || event == NETDEV_DOWN) { + _ipv6_addr = NATIVE_MALLOC(dhd_pub->osh, sizeof(struct ipv6_addr)); + if (_ipv6_addr == NULL) { + DHD_ERROR(("Failed to allocate ipv6\n")); + goto exit; + } + memcpy(&_ipv6_addr->ipv6_addr[0], &inet6_ifa->addr, IPV6_ADDR_LEN); + DHD_TRACE(("IPV6 address : %pI6\n", &inet6_ifa->addr)); + } + switch (event) { + case NETDEV_UP: + DHD_TRACE(("%s: Enable NDO and add ipv6 into table \n ", __FUNCTION__)); + _ipv6_addr->ipv6_oper = DHD_IPV6_ADDR_ADD; + break; + case NETDEV_DOWN: + DHD_TRACE(("%s: clear ipv6 table \n", __FUNCTION__)); + _ipv6_addr->ipv6_oper = DHD_IPV6_ADDR_DELETE; + break; + default: + DHD_ERROR(("%s: unknown notifier event \n", __FUNCTION__)); + goto exit; + } + spin_lock_bh(&dhd->iflist[idx]->ipv6_lock); + list_add_tail(&_ipv6_addr->list, &dhd->iflist[idx]->ipv6_list); + spin_unlock_bh(&dhd->iflist[idx]->ipv6_lock); + up(&dhd->thr_sysioc_ctl.sema); +exit: + return NOTIFY_DONE; +} + int dhd_net_attach(dhd_pub_t *dhdp, int ifidx) { @@ -4890,19 +5267,20 @@ dhd_net_attach(dhd_pub_t *dhdp, int ifidx) net->ethtool_ops = &dhd_ethtool_ops; #endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 24) */ -#if defined(CONFIG_WIRELESS_EXT) +#if defined(WL_WIRELESS_EXT) #if WIRELESS_EXT < 19 net->get_wireless_stats = dhd_get_wireless_stats; #endif /* WIRELESS_EXT < 19 */ #if WIRELESS_EXT > 12 net->wireless_handlers = (struct iw_handler_def *)&wl_iw_handler_def; #endif /* WIRELESS_EXT > 12 */ -#endif /* defined(CONFIG_WIRELESS_EXT) */ +#endif /* defined(WL_WIRELESS_EXT) */ dhd->pub.rxsz = DBUS_RX_BUFFER_SIZE_DHD(net); memcpy(net->dev_addr, temp_addr, ETHER_ADDR_LEN); + net->ifindex = 0; if ((err = register_netdev(net)) != 0) { DHD_ERROR(("couldn't register the net device, err %d\n", err)); goto fail; @@ -4916,12 +5294,16 @@ dhd_net_attach(dhd_pub_t *dhdp, int ifidx) MAC2STRDBG(net->dev_addr)); #endif /* CUSTOMER_HW4 */ -#if defined(SOFTAP) && defined(CONFIG_WIRELESS_EXT) && !defined(WL_CFG80211) +#if defined(SOFTAP) && defined(WL_WIRELESS_EXT) && !defined(WL_CFG80211) wl_iw_iscan_set_scan_broadcast_prep(net, 1); #endif #if 1 && (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) if (ifidx == 0) { + if (!dhd_download_fw_on_driverload) { + dhd_dev_reset(net, TRUE); + sdioh_stop(NULL); + } dhd_registration_check = TRUE; up(&dhd_registration_sem); } @@ -4982,6 +5364,10 @@ void dhd_detach(dhd_pub_t *dhdp) return; DHD_TRACE(("%s: Enter state 0x%x\n", __FUNCTION__, dhd->dhd_state)); +#ifdef ARP_OFFLOAD_SUPPORT + unregister_inetaddr_notifier(&dhd_notifier); +#endif /* ARP_OFFLOAD_SUPPORT */ + unregister_inet6addr_notifier(&dhd_notifier_ipv6); dhd->pub.up = 0; if (!(dhd->dhd_state & DHD_ATTACH_STATE_DONE)) { @@ -4997,11 +5383,6 @@ void dhd_detach(dhd_pub_t *dhdp) if (dhdp->prot) dhd_prot_detach(dhdp); } - -#ifdef ARP_OFFLOAD_SUPPORT - unregister_inetaddr_notifier(&dhd_notifier); -#endif /* ARP_OFFLOAD_SUPPORT */ - #if defined(CONFIG_HAS_EARLYSUSPEND) && defined(DHD_USE_EARLYSUSPEND) if (dhd->dhd_state & DHD_ATTACH_STATE_EARLYSUSPEND_DONE) { if (dhd->early_suspend.suspend) @@ -5013,12 +5394,12 @@ void dhd_detach(dhd_pub_t *dhdp) cancel_work_sync(&dhd->work_hang); #endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) */ -#if defined(CONFIG_WIRELESS_EXT) +#if defined(WL_WIRELESS_EXT) if (dhd->dhd_state & DHD_ATTACH_STATE_WL_ATTACH) { /* Detatch and unlink in the iw */ wl_iw_detach(); } -#endif /* defined(CONFIG_WIRELESS_EXT) */ +#endif /* defined(WL_WIRELESS_EXT) */ if (dhd->thr_sysioc_ctl.thr_pid >= 0) { PROC_STOP(&dhd->thr_sysioc_ctl); @@ -5093,39 +5474,26 @@ void dhd_detach(dhd_pub_t *dhdp) } #endif +#ifdef PNO_SUPPORT + if (dhdp->pno_state) + dhd_pno_deinit(dhdp); +#endif -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) && (LINUX_VERSION_CODE <= \ - KERNEL_VERSION(2, 6, 39)) && defined(CONFIG_PM_SLEEP) - unregister_pm_notifier(&dhd_sleep_pm_notifier); -#endif /* LINUX_VERSION >= 2.6.27 && LINUX_VERSION <= 2.6.39 && defined(CONFIG_PM_SLEEP) */ +#if defined(CONFIG_PM_SLEEP) + unregister_pm_notifier(&dhd->pm_notifier); +#endif /* CONFIG_PM_SLEEP */ if (dhd->dhd_state & DHD_ATTACH_STATE_WAKELOCKS_INIT) { - printk("wd wakelock count:%d\n", dhd->wakelock_wd_counter); + DHD_TRACE(("wd wakelock count:%d\n", dhd->wakelock_wd_counter)); #ifdef CONFIG_HAS_WAKELOCK dhd->wakelock_counter = 0; dhd->wakelock_wd_counter = 0; dhd->wakelock_rx_timeout_enable = 0; dhd->wakelock_ctrl_timeout_enable = 0; - if (dhd->wl_wifi) { - wake_lock_destroy(dhd->wl_wifi); - MFREE(dhd->pub.osh, dhd->wl_wifi, sizeof(struct wake_lock)); - dhd->wl_wifi = NULL; - } - if (dhd->wl_rxwake) { - wake_lock_destroy(dhd->wl_rxwake); - MFREE(dhd->pub.osh, dhd->wl_rxwake, sizeof(struct wake_lock)); - dhd->wl_rxwake = NULL; - } - if (dhd->wl_ctrlwake) { - wake_lock_destroy(dhd->wl_ctrlwake); - MFREE(dhd->pub.osh, dhd->wl_ctrlwake, sizeof(struct wake_lock)); - dhd->wl_ctrlwake = NULL; - } - if (dhd->wl_wdwake) { - wake_lock_destroy(dhd->wl_wdwake); - MFREE(dhd->pub.osh, dhd->wl_wdwake, sizeof(struct wake_lock)); - dhd->wl_wdwake = NULL; - } + wake_lock_destroy(&dhd->wl_wifi); + wake_lock_destroy(&dhd->wl_rxwake); + wake_lock_destroy(&dhd->wl_ctrlwake); + wake_lock_destroy(&dhd->wl_wdwake); #endif /* CONFIG_HAS_WAKELOCK */ } } @@ -5176,6 +5544,13 @@ dhd_module_cleanup(void) { DHD_TRACE(("%s: Enter\n", __FUNCTION__)); +#if defined(WL_CFG80211) && defined(SUPPORT_DEEP_SLEEP) + /* Force to set the flags to FALSE not to enter + * the deepsleep mode while WLAN is turning off + */ + use_deepsleep_onoff = trigger_deep_sleep = FALSE; +#endif /* OEM_ANDROID && WL_CFG80211 && SUPPORT_DEEP_SLEEP */ + dhd_bus_unregister(); #if defined(CONFIG_WIFI_CONTROL_FUNC) @@ -5218,14 +5593,20 @@ dhd_module_init(void) break; DHD_ERROR(("Invalid module parameters.\n")); - return -EINVAL; + error = -EINVAL; } while (0); #endif + if (error) + goto fail_0; #if 1 && defined(BCMLXSDMMC) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) do { sema_init(&dhd_chipup_sem, 0); - dhd_bus_reg_sdio_notify(&dhd_chipup_sem); + error = dhd_bus_reg_sdio_notify(&dhd_chipup_sem); + if (error) { + DHD_ERROR(("n%s dhd_bus_reg_sdio_notify fail(%d)\n\n", __func__, error)); + goto fail_1; + } dhd_customer_gpio_wlan_ctrl(WLAN_POWER_ON); #if defined(CONFIG_WIFI_CONTROL_FUNC) if (wl_android_wifictrl_func_add() < 0) { @@ -5250,7 +5631,8 @@ dhd_module_init(void) if (!chip_up) { DHD_ERROR(("\nfailed to power up wifi chip, max retry reached, exits **\n\n")); - return -ENODEV; + error = -ENODEV; + goto fail_0; } #else dhd_customer_gpio_wlan_ctrl(WLAN_POWER_ON); @@ -5261,7 +5643,7 @@ dhd_module_init(void) #endif -#if defined(CONFIG_WIFI_CONTROL_FUNC) +#if defined(CONFIG_WIFI_CONTROL_FUNC) && defined(BCMLXSDMMC) /* If the wifi_set_power() is failed, * we need to jump error handling routines. */ @@ -5286,7 +5668,7 @@ dhd_module_init(void) goto fail_1; } -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) && defined(BCMLXSDMMC) /* * Wait till MMC sdio_register_driver callback called and made driver attach. * It's needed to make sync up exit from dhd insmod and @@ -5306,7 +5688,7 @@ dhd_module_init(void) return error; -#if 1 && (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) +#if 1 && (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) && defined(BCMLXSDMMC) fail_2: dhd_bus_unregister(); #endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) */ @@ -5320,6 +5702,10 @@ dhd_module_init(void) /* Call customer gpio to turn off power with WL_REG_ON signal */ dhd_customer_gpio_wlan_ctrl(WLAN_POWER_OFF); +fail_0: + + wl_android_exit(); + return error; } @@ -5405,6 +5791,19 @@ dhd_os_ioctl_resp_wake(dhd_pub_t *pub) return 0; } +void +dhd_os_wd_timer_extend(void *bus, bool extend) +{ + dhd_pub_t *pub = bus; + dhd_info_t *dhd = (dhd_info_t *)pub->info; + + if (extend) + dhd_os_wd_timer(bus, WATCHDOG_EXTEND_INTERVAL); + else + dhd_os_wd_timer(bus, dhd->default_wd_interval); +} + + void dhd_os_wd_timer(void *bus, uint wdtick) { @@ -5418,15 +5817,14 @@ dhd_os_wd_timer(void *bus, uint wdtick) DHD_ERROR(("%s: dhd NULL\n", __FUNCTION__)); return; } - if (wdtick) - DHD_OS_WD_WAKE_LOCK(pub); flags = dhd_os_spin_lock(pub); /* don't start the wd until fw is loaded */ if (pub->busstate == DHD_BUS_DOWN) { dhd_os_spin_unlock(pub, flags); - DHD_OS_WD_WAKE_UNLOCK(pub); + if (!wdtick) + DHD_OS_WD_WAKE_UNLOCK(pub); return; } @@ -5444,6 +5842,7 @@ dhd_os_wd_timer(void *bus, uint wdtick) } if (wdtick) { + DHD_OS_WD_WAKE_LOCK(pub); dhd_watchdog_ms = (uint)wdtick; /* Re arm the timer, at last watchdog period */ mod_timer(&dhd->timer, jiffies + msecs_to_jiffies(dhd_watchdog_ms)); @@ -5617,7 +6016,7 @@ void dhd_os_prefree(void *osh, void *addr, uint size) } #endif /* defined(CONFIG_WIFI_CONTROL_FUNC) */ -#if defined(CONFIG_WIRELESS_EXT) +#if defined(WL_WIRELESS_EXT) struct iw_statistics * dhd_get_wireless_stats(struct net_device *dev) { @@ -5635,7 +6034,7 @@ dhd_get_wireless_stats(struct net_device *dev) else return NULL; } -#endif /* defined(CONFIG_WIRELESS_EXT) */ +#endif /* defined(WL_WIRELESS_EXT) */ static int dhd_wl_host_event(dhd_info_t *dhd, int *ifidx, void *pktdata, @@ -5648,7 +6047,7 @@ dhd_wl_host_event(dhd_info_t *dhd, int *ifidx, void *pktdata, if (bcmerror != BCME_OK) return (bcmerror); -#if defined(CONFIG_WIRELESS_EXT) +#if defined(WL_WIRELESS_EXT) if (event->bsscfgidx == 0) { /* * Wireless ext is on primary interface only @@ -5661,7 +6060,7 @@ dhd_wl_host_event(dhd_info_t *dhd, int *ifidx, void *pktdata, wl_iw_event(dhd->iflist[*ifidx]->net, event, *data); } } -#endif /* defined(CONFIG_WIRELESS_EXT) */ +#endif /* defined(WL_WIRELESS_EXT) */ #ifdef WL_CFG80211 if ((ntoh32(event->event_type) == WLC_E_IF) && @@ -5837,6 +6236,24 @@ dhd_dev_reset(struct net_device *dev, uint8 flag) if (dhd_wl_ioctl_cmd(&dhd->pub, WLC_DOWN, NULL, 0, TRUE, 0) < 0) { DHD_TRACE(("%s: wl down failed\n", __FUNCTION__)); } +#if defined(PROP_TXSTATUS) +#ifdef PROP_TXSTATUS_VSDB + if (dhd->pub.op_mode == DHD_FLAG_IBSS_MODE) { + dhd_wlfc_deinit(&dhd->pub); + if (dhd->pub.plat_deinit) + dhd->pub.plat_deinit((void *)&dhd->pub); + } +#else + dhd_wlfc_deinit(&dhd->pub); + if (dhd->pub.plat_deinit) + dhd->pub.plat_deinit((void *)&dhd->pub); +#endif /* PROP_TXSTATUS_VSDB */ +#endif /* PROP_TXSTATUS */ + +#ifdef PNO_SUPPORT + if (dhd->pub.pno_state) + dhd_pno_deinit(&dhd->pub); +#endif } ret = dhd_bus_devreset(&dhd->pub, flag); @@ -5870,6 +6287,9 @@ int net_os_set_suspend(struct net_device *dev, int val, int force) ret = dhd_set_suspend(val, &dhd->pub); #else ret = dhd_suspend_resume_helper(dhd, val, force); +#endif +#ifdef WL_CFG80211 + wl_cfg80211_update_power_mode(dev); #endif } return ret; @@ -5927,7 +6347,7 @@ dhd_dev_init_ioctl(struct net_device *dev) dhd_process_cid_mac(&dhd->pub, TRUE); - if ((ret = dhd_preinit_ioctls(&dhd->pub)) < 0) + if ((ret = dhd_prot_init(&dhd->pub)) < 0) goto done; dhd_process_cid_mac(&dhd->pub, FALSE); @@ -5937,45 +6357,63 @@ dhd_dev_init_ioctl(struct net_device *dev) } #ifdef PNO_SUPPORT -/* Linux wrapper to call common dhd_pno_clean */ +/* Linux wrapper to call common dhd_pno_stop_for_ssid */ int -dhd_dev_pno_reset(struct net_device *dev) +dhd_dev_pno_stop_for_ssid(struct net_device *dev) { dhd_info_t *dhd = *(dhd_info_t **)netdev_priv(dev); - return (dhd_pno_clean(&dhd->pub)); + return (dhd_pno_stop_for_ssid(&dhd->pub)); } +/* Linux wrapper to call common dhd_pno_set_for_ssid */ +int +dhd_dev_pno_set_for_ssid(struct net_device *dev, wlc_ssid_t* ssids_local, int nssid, + uint16 scan_fr, int pno_repeat, int pno_freq_expo_max, uint16 *channel_list, int nchan) +{ + dhd_info_t *dhd = *(dhd_info_t **)netdev_priv(dev); + return (dhd_pno_set_for_ssid(&dhd->pub, ssids_local, nssid, scan_fr, + pno_repeat, pno_freq_expo_max, channel_list, nchan)); +} /* Linux wrapper to call common dhd_pno_enable */ int -dhd_dev_pno_enable(struct net_device *dev, int pfn_enabled) +dhd_dev_pno_enable(struct net_device *dev, int enable) { dhd_info_t *dhd = *(dhd_info_t **)netdev_priv(dev); - return (dhd_pno_enable(&dhd->pub, pfn_enabled)); + return (dhd_pno_enable(&dhd->pub, enable)); } - -/* Linux wrapper to call common dhd_pno_set */ +/* Linux wrapper to call common dhd_pno_set_for_hotlist */ int -dhd_dev_pno_set(struct net_device *dev, wlc_ssid_t* ssids_local, int nssid, - ushort scan_fr, int pno_repeat, int pno_freq_expo_max) +dhd_dev_pno_set_for_hotlist(struct net_device *dev, wl_pfn_bssid_t *p_pfn_bssid, + struct dhd_pno_hotlist_params *hotlist_params) { dhd_info_t *dhd = *(dhd_info_t **)netdev_priv(dev); - - return (dhd_pno_set(&dhd->pub, ssids_local, nssid, scan_fr, pno_repeat, pno_freq_expo_max)); + return (dhd_pno_set_for_hotlist(&dhd->pub, p_pfn_bssid, hotlist_params)); } - -/* Linux wrapper to get pno status */ +/* Linux wrapper to call common dhd_dev_pno_stop_for_batch */ int -dhd_dev_get_pno_status(struct net_device *dev) +dhd_dev_pno_stop_for_batch(struct net_device *dev) { dhd_info_t *dhd = *(dhd_info_t **)netdev_priv(dev); - - return (dhd_pno_get_status(&dhd->pub)); + return (dhd_pno_stop_for_batch(&dhd->pub)); +} +/* Linux wrapper to call common dhd_dev_pno_set_for_batch */ +int +dhd_dev_pno_set_for_batch(struct net_device *dev, struct dhd_pno_batch_params *batch_params) +{ + dhd_info_t *dhd = *(dhd_info_t **)netdev_priv(dev); + return (dhd_pno_set_for_batch(&dhd->pub, batch_params)); +} +/* Linux wrapper to call common dhd_dev_pno_get_for_batch */ +int +dhd_dev_pno_get_for_batch(struct net_device *dev, char *buf, int bufsize) +{ + dhd_info_t *dhd = *(dhd_info_t **)netdev_priv(dev); + return (dhd_pno_get_for_batch(&dhd->pub, buf, bufsize, PNO_STATUS_NORMAL)); } - #endif /* PNO_SUPPORT */ #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) && (1) @@ -5992,9 +6430,9 @@ static void dhd_hang_process(struct work_struct *work) if (!dhd_download_fw_on_driverload && (strstr(fw_path, "_apsta") || strstr(fw_path, "_mfg"))) { #endif /* CUSTOMER_HW4 */ - rtnl_lock(); - dev_close(dev); - rtnl_unlock(); + rtnl_lock(); + dev_close(dev); + rtnl_unlock(); #ifdef CUSTOMER_HW4 } #endif /* CUSTOMER_HW4 */ @@ -6024,23 +6462,32 @@ int net_os_send_hang_message(struct net_device *dev) dhd_info_t *dhd = *(dhd_info_t **)netdev_priv(dev); int ret = 0; - if (dhd) + if (dhd) { + /* Report FW problem when enabled */ + if (dhd->pub.hang_report) { #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) - ret = dhd_os_send_hang_message(&dhd->pub); + ret = dhd_os_send_hang_message(&dhd->pub); #else - ret = wl_cfg80211_hang(dev, WLAN_REASON_UNSPECIFIED); + ret = wl_cfg80211_hang(dev, WLAN_REASON_UNSPECIFIED); #endif + } else { + DHD_ERROR(("%s: FW HANG ignored (for testing purpose) and not sent up\n", + __FUNCTION__)); + /* Enforce bus down to stop any future traffic */ + dhd->pub.busstate = DHD_BUS_DOWN; + } + } return ret; } #endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27) && OEM_ANDROID */ -void dhd_bus_country_set(struct net_device *dev, wl_country_t *cspec) +void dhd_bus_country_set(struct net_device *dev, wl_country_t *cspec, bool notify) { dhd_info_t *dhd = *(dhd_info_t **)netdev_priv(dev); if (dhd && dhd->pub.up) { memcpy(&dhd->pub.dhd_cspec, cspec, sizeof(wl_country_t)); #ifdef WL_CFG80211 - wl_update_wiphybands(NULL); + wl_update_wiphybands(NULL, notify); #endif } } @@ -6050,7 +6497,7 @@ void dhd_bus_band_set(struct net_device *dev, uint band) dhd_info_t *dhd = *(dhd_info_t **)netdev_priv(dev); if (dhd && dhd->pub.up) { #ifdef WL_CFG80211 - wl_update_wiphybands(NULL); + wl_update_wiphybands(NULL, true); #endif } } @@ -6202,10 +6649,10 @@ int dhd_os_wake_lock_timeout(dhd_pub_t *pub) dhd->wakelock_rx_timeout_enable : dhd->wakelock_ctrl_timeout_enable; #ifdef CONFIG_HAS_WAKELOCK if (dhd->wakelock_rx_timeout_enable) - wake_lock_timeout(dhd->wl_rxwake, + wake_lock_timeout(&dhd->wl_rxwake, msecs_to_jiffies(dhd->wakelock_rx_timeout_enable)); if (dhd->wakelock_ctrl_timeout_enable) - wake_lock_timeout(dhd->wl_ctrlwake, + wake_lock_timeout(&dhd->wl_ctrlwake, msecs_to_jiffies(dhd->wakelock_ctrl_timeout_enable)); #endif dhd->wakelock_rx_timeout_enable = 0; @@ -6253,6 +6700,23 @@ int dhd_os_wake_lock_ctrl_timeout_enable(dhd_pub_t *pub, int val) return 0; } +int dhd_os_wake_lock_ctrl_timeout_cancel(dhd_pub_t *pub) +{ + dhd_info_t *dhd = (dhd_info_t *)(pub->info); + unsigned long flags; + + if (dhd) { + spin_lock_irqsave(&dhd->wakelock_spinlock, flags); + dhd->wakelock_ctrl_timeout_enable = 0; +#ifdef CONFIG_HAS_WAKELOCK + if (wake_lock_active(&dhd->wl_ctrlwake)) + wake_unlock(&dhd->wl_ctrlwake); +#endif + spin_unlock_irqrestore(&dhd->wakelock_spinlock, flags); + } + return 0; +} + int net_os_wake_lock_rx_timeout_enable(struct net_device *dev, int val) { dhd_info_t *dhd = *(dhd_info_t **)netdev_priv(dev); @@ -6283,7 +6747,7 @@ int dhd_os_wake_lock(dhd_pub_t *pub) spin_lock_irqsave(&dhd->wakelock_spinlock, flags); #ifdef CONFIG_HAS_WAKELOCK if (!dhd->wakelock_counter) - wake_lock(dhd->wl_wifi); + wake_lock(&dhd->wl_wifi); #elif 1 && (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 36)) if (pm_dev) pm_stay_awake(pm_dev); @@ -6318,7 +6782,7 @@ int dhd_os_wake_unlock(dhd_pub_t *pub) dhd->wakelock_counter--; #ifdef CONFIG_HAS_WAKELOCK if (!dhd->wakelock_counter) - wake_unlock(dhd->wl_wifi); + wake_unlock(&dhd->wl_wifi); #elif 1 && (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 36)) if (pm_dev) pm_relax(pm_dev); @@ -6343,7 +6807,9 @@ int dhd_os_check_wakelock(void *dhdp) #endif /* CONFIG_HAS_WAKELOCK || BCMSDIO */ #ifdef CONFIG_HAS_WAKELOCK - if (dhd && wake_lock_active(dhd->wl_wifi)) + /* Indicate to the SD Host to avoid going to suspend if internal locks are up */ + if (dhd && (wake_lock_active(&dhd->wl_wifi) || + (wake_lock_active(&dhd->wl_wdwake)))) return 1; #elif 1 && (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 36)) if (dhd && (dhd->wakelock_counter > 0) && pm_dev) @@ -6371,14 +6837,8 @@ int dhd_os_wd_wake_lock(dhd_pub_t *pub) spin_lock_irqsave(&dhd->wakelock_spinlock, flags); #ifdef CONFIG_HAS_WAKELOCK /* if wakelock_wd_counter was never used : lock it at once */ - if (!dhd->wakelock_wd_counter) { - if (dhd->wl_wdwake) - wake_lock(dhd->wl_wdwake); - else { - spin_unlock_irqrestore(&dhd->wakelock_spinlock, flags); - return 0; - } - } + if (!dhd->wakelock_wd_counter) + wake_lock(&dhd->wl_wdwake); #endif dhd->wakelock_wd_counter++; ret = dhd->wakelock_wd_counter; @@ -6398,7 +6858,7 @@ int dhd_os_wd_wake_unlock(dhd_pub_t *pub) if (dhd->wakelock_wd_counter) { dhd->wakelock_wd_counter = 0; #ifdef CONFIG_HAS_WAKELOCK - wake_unlock(dhd->wl_wdwake); + wake_unlock(&dhd->wl_wdwake); #endif } spin_unlock_irqrestore(&dhd->wakelock_spinlock, flags); @@ -6413,6 +6873,21 @@ int dhd_os_check_if_up(void *dhdp) return 0; return pub->up; } +/* function to collect firmware, chip id and chip version info */ +void dhd_set_version_info(dhd_pub_t *dhdp, char *fw) +{ + int i; + + i = snprintf(info_string, sizeof(info_string), + " Driver: %s\n Firmware: %s ", EPI_VERSION_STR, fw); + + if (!dhdp) + return; + + i = snprintf(&info_string[i], sizeof(info_string) - i, + "\n Chip: %x Rev %x Pkg %x", dhd_bus_chip_id(dhdp), + dhd_bus_chiprev_id(dhdp), dhd_bus_chippkg_id(dhdp)); +} int dhd_ioctl_entry_local(struct net_device *net, wl_ioctl_t *ioc, int cmd) { int ifidx; @@ -6447,6 +6922,10 @@ bool dhd_os_check_hang(dhd_pub_t *dhdp, int ifidx, int ret) struct net_device *net; net = dhd_idx2net(dhdp, ifidx); + if (!net) { + DHD_ERROR(("%s : Invalid index : %d\n", __FUNCTION__, ifidx)); + return -EINVAL; + } return dhd_check_hang(net, dhdp, ret); } @@ -6484,6 +6963,7 @@ int dhd_deepsleep(struct net_device *dev, int flag) memset(iovbuf, 0, sizeof(iovbuf)); bcm_mkiovar("deepsleep", (char *)&powervar, 4, iovbuf, sizeof(iovbuf)); dhd_wl_ioctl_cmd(dhdp, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); + is_deepsleep_on = TRUE; break; case 0: /* Deepsleep Off */ @@ -6520,12 +7000,13 @@ int dhd_deepsleep(struct net_device *dev, int flag) memset(iovbuf, 0, sizeof(iovbuf)); bcm_mkiovar("mpc", (char *)&powervar, 4, iovbuf, sizeof(iovbuf)); dhd_wl_ioctl_cmd(dhdp, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); + is_deepsleep_on = FALSE; break; } return 0; } -#endif /* WL_CFG80211 && SUPPORT_DEEP_SLEEP */ +#endif /* OEM_ANDROID && WL_CFG80211 && SUPPORT_DEEP_SLEEP */ #ifdef PROP_TXSTATUS extern int dhd_wlfc_interface_entry_update(void* state, ewlfc_mac_entry_action_t action, uint8 ifid, @@ -6553,6 +7034,35 @@ int dhd_wlfc_event(struct dhd_info *dhd) { return dhd_wlfc_enable(&dhd->pub); } + +void dhd_wlfc_plat_enable(void *dhd) +{ +#if defined(CUSTOMER_HW4) && defined(USE_DYNAMIC_F2_BLKSIZE) + dhdsdio_func_blocksize((dhd_pub_t *)dhd, 2, DYNAMIC_F2_BLKSIZE_FOR_NONLEGACY); +#endif /* CUSTOMER_HW4 && USE_DYNAMIC_F2_BLKSIZE */ + return; +} + +void dhd_wlfc_plat_deinit(void *dhd) +{ +#if defined(CUSTOMER_HW4) && defined(USE_DYNAMIC_F2_BLKSIZE) + dhdsdio_func_blocksize((dhd_pub_t *)dhd, 2, sd_f2_blocksize); +#endif /* CUSTOMER_HW4 && USE_DYNAMIC_F2_BLKSIZE */ + return; +} + +bool dhd_wlfc_skip_fc(void) +{ + +#ifdef WL_CFG80211 + extern struct wl_priv *wlcfg_drv_priv; + + /* enable flow control in vsdb mode */ + return !(wlcfg_drv_priv && wlcfg_drv_priv->vsdb_mode); +#else + return TRUE; /* skip flow control */ +#endif /* WL_CFG80211 */ +} #endif /* PROP_TXSTATUS */ #ifdef BCMDBGFS diff --git a/drivers/net/wireless/bcmdhd/dhd_linux_sched.c b/drivers/net/wireless/bcmdhd/dhd_linux_sched.c index 290caf7e658..3486c7b215e 100644 --- a/drivers/net/wireless/bcmdhd/dhd_linux_sched.c +++ b/drivers/net/wireless/bcmdhd/dhd_linux_sched.c @@ -1,7 +1,7 @@ /* * Expose some of the kernel scheduler routines * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd/dhd_pno.c b/drivers/net/wireless/bcmdhd/dhd_pno.c new file mode 100644 index 00000000000..3696a83544c --- /dev/null +++ b/drivers/net/wireless/bcmdhd/dhd_pno.c @@ -0,0 +1,1884 @@ +/* + * Broadcom Dongle Host Driver (DHD) + * Prefered Network Offload and Wi-Fi Location Service(WLS) code. + * + * Copyright (C) 1999-2013, Broadcom Corporation + * + * Unless you and Broadcom execute a separate written software license + * agreement governing use of this software, this software is licensed to you + * under the terms of the GNU General Public License version 2 (the "GPL"), + * available at http://www.broadcom.com/licenses/GPLv2.php, with the + * following added to such license: + * + * As a special exception, the copyright holders of this software give you + * permission to link this software with independent modules, and to copy and + * distribute the resulting executable under terms of your choice, provided that + * you also meet, for each linked independent module, the terms and conditions of + * the license of that module. An independent module is a module which is not + * derived from this software. The special exception does not apply to any + * modifications of the software. + * + * Notwithstanding the above, under no circumstances may you combine this + * software in any way with any other Broadcom software provided under a license + * other than the GPL, without Broadcom's express prior written consent. + * + * $Id: dhd_pno.c 435029 2013-11-08 02:47:59Z $ + */ +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#ifdef __BIG_ENDIAN +#include +#define htod32(i) (bcmswap32(i)) +#define htod16(i) (bcmswap16(i)) +#define dtoh32(i) (bcmswap32(i)) +#define dtoh16(i) (bcmswap16(i)) +#define htodchanspec(i) htod16(i) +#define dtohchanspec(i) dtoh16(i) +#else +#define htod32(i) (i) +#define htod16(i) (i) +#define dtoh32(i) (i) +#define dtoh16(i) (i) +#define htodchanspec(i) (i) +#define dtohchanspec(i) (i) +#endif /* IL_BIGENDINA */ + +#define NULL_CHECK(p, s, err) \ + do { \ + if (!(p)) { \ + printf("NULL POINTER (%s) : %s\n", __FUNCTION__, (s)); \ + err = BCME_ERROR; \ + return err; \ + } \ + } while (0) +#define PNO_GET_PNOSTATE(dhd) ((dhd_pno_status_info_t *)dhd->pno_state) +#define PNO_BESTNET_LEN 1024 +#define PNO_ON 1 +#define PNO_OFF 0 +#define CHANNEL_2G_MAX 14 +#define MAX_NODE_CNT 5 +#define WLS_SUPPORTED(pno_state) (pno_state->wls_supported == TRUE) +#define TIME_DIFF(timestamp1, timestamp2) (abs((uint32)(timestamp1/1000) \ + - (uint32)(timestamp2/1000))) + +#define ENTRY_OVERHEAD strlen("bssid=\nssid=\nfreq=\nlevel=\nage=\ndist=\ndistSd=\n====") +#define TIME_MIN_DIFF 5 +static inline bool +is_dfs(uint16 channel) +{ + if (channel >= 52 && channel <= 64) /* class 2 */ + return TRUE; + else if (channel >= 100 && channel <= 140) /* class 4 */ + return TRUE; + else + return FALSE; +} + +int +dhd_pno_clean(dhd_pub_t *dhd) +{ + int pfn = 0; + int err; + dhd_pno_status_info_t *_pno_state; + NULL_CHECK(dhd, "dhd is NULL", err); + NULL_CHECK(dhd->pno_state, "pno_state is NULL", err); + _pno_state = PNO_GET_PNOSTATE(dhd); + DHD_PNO(("%s enter\n", __FUNCTION__)); + /* Disable PNO */ + err = dhd_iovar(dhd, 0, "pfn", (char *)&pfn, sizeof(pfn), 1); + if (err < 0) { + DHD_ERROR(("%s : failed to execute pfn(error : %d)\n", + __FUNCTION__, err)); + goto exit; + } + _pno_state->pno_status = DHD_PNO_DISABLED; + err = dhd_iovar(dhd, 0, "pfnclear", NULL, 0, 1); + if (err < 0) { + DHD_ERROR(("%s : failed to execute pfnclear(error : %d)\n", + __FUNCTION__, err)); + } +exit: + return err; +} + +static int +_dhd_pno_suspend(dhd_pub_t *dhd) +{ + int err; + int suspend = 1; + dhd_pno_status_info_t *_pno_state; + NULL_CHECK(dhd, "dhd is NULL", err); + NULL_CHECK(dhd->pno_state, "pno_state is NULL", err); + + DHD_PNO(("%s enter\n", __FUNCTION__)); + _pno_state = PNO_GET_PNOSTATE(dhd); + err = dhd_iovar(dhd, 0, "pfn_suspend", (char *)&suspend, sizeof(suspend), 1); + if (err < 0) { + DHD_ERROR(("%s : failed to suspend pfn(error :%d)\n", __FUNCTION__, err)); + goto exit; + + } + _pno_state->pno_status = DHD_PNO_SUSPEND; +exit: + return err; +} +static int +_dhd_pno_enable(dhd_pub_t *dhd, int enable) +{ + int err = BCME_OK; + dhd_pno_status_info_t *_pno_state; + NULL_CHECK(dhd, "dhd is NULL", err); + NULL_CHECK(dhd->pno_state, "pno_state is NULL", err); + _pno_state = PNO_GET_PNOSTATE(dhd); + DHD_PNO(("%s enter\n", __FUNCTION__)); + + if (enable & 0xfffe) { + DHD_ERROR(("%s invalid value\n", __FUNCTION__)); + err = BCME_BADARG; + goto exit; + } + if (!dhd_support_sta_mode(dhd)) { + DHD_ERROR(("PNO is not allowed for non-STA mode")); + err = BCME_BADOPTION; + goto exit; + } + if (enable) { + if ((_pno_state->pno_mode & DHD_PNO_LEGACY_MODE) && + dhd_is_associated(dhd, NULL, NULL)) { + DHD_ERROR(("%s Legacy PNO mode cannot be enabled " + "in assoc mode , ignore it\n", __FUNCTION__)); + err = BCME_BADOPTION; + goto exit; + } + } + /* Enable/Disable PNO */ + err = dhd_iovar(dhd, 0, "pfn", (char *)&enable, sizeof(enable), 1); + if (err < 0) { + DHD_ERROR(("%s : failed to execute pfn_set\n", __FUNCTION__)); + goto exit; + } + _pno_state->pno_status = (enable)? + DHD_PNO_ENABLED : DHD_PNO_DISABLED; + if (!enable) + _pno_state->pno_mode = DHD_PNO_NONE_MODE; + + DHD_PNO(("%s set pno as %s\n", + __FUNCTION__, enable ? "Enable" : "Disable")); +exit: + return err; +} + +static int +_dhd_pno_set(dhd_pub_t *dhd, const dhd_pno_params_t *pno_params, dhd_pno_mode_t mode) +{ + int err = BCME_OK; + wl_pfn_param_t pfn_param; + dhd_pno_params_t *_params; + dhd_pno_status_info_t *_pno_state; + bool combined_scan = FALSE; + DHD_PNO(("%s enter\n", __FUNCTION__)); + + NULL_CHECK(dhd, "dhd is NULL", err); + NULL_CHECK(dhd->pno_state, "pno_state is NULL", err); + _pno_state = PNO_GET_PNOSTATE(dhd); + + memset(&pfn_param, 0, sizeof(pfn_param)); + + /* set pfn parameters */ + pfn_param.version = htod32(PFN_VERSION); + pfn_param.flags = ((PFN_LIST_ORDER << SORT_CRITERIA_BIT) | + (ENABLE << IMMEDIATE_SCAN_BIT) | (ENABLE << REPORT_SEPERATELY_BIT)); + if (mode == DHD_PNO_LEGACY_MODE) { + /* check and set extra pno params */ + if ((pno_params->params_legacy.pno_repeat != 0) || + (pno_params->params_legacy.pno_freq_expo_max != 0)) { + pfn_param.flags |= htod16(ENABLE << ENABLE_ADAPTSCAN_BIT); + pfn_param.repeat = (uchar) (pno_params->params_legacy.pno_repeat); + pfn_param.exp = (uchar) (pno_params->params_legacy.pno_freq_expo_max); + } + /* set up pno scan fr */ + if (pno_params->params_legacy.scan_fr != 0) + pfn_param.scan_freq = htod32(pno_params->params_legacy.scan_fr); + if (_pno_state->pno_mode & DHD_PNO_BATCH_MODE) { + DHD_PNO(("will enable combined scan with BATCHIG SCAN MODE\n")); + mode |= DHD_PNO_BATCH_MODE; + combined_scan = TRUE; + } else if (_pno_state->pno_mode & DHD_PNO_HOTLIST_MODE) { + DHD_PNO(("will enable combined scan with HOTLIST SCAN MODE\n")); + mode |= DHD_PNO_HOTLIST_MODE; + combined_scan = TRUE; + } + } + if (mode & (DHD_PNO_BATCH_MODE | DHD_PNO_HOTLIST_MODE)) { + /* Scan frequency of 30 sec */ + pfn_param.scan_freq = htod32(30); + /* slow adapt scan is off by default */ + pfn_param.slow_freq = htod32(0); + /* RSSI margin of 30 dBm */ + pfn_param.rssi_margin = htod16(30); + /* Network timeout 60 sec */ + pfn_param.lost_network_timeout = htod32(60); + /* best n = 2 by default */ + pfn_param.bestn = DEFAULT_BESTN; + /* mscan m=0 by default, so not record best networks by default */ + pfn_param.mscan = DEFAULT_MSCAN; + /* default repeat = 10 */ + pfn_param.repeat = DEFAULT_REPEAT; + /* by default, maximum scan interval = 2^2 + * scan_freq when adaptive scan is turned on + */ + pfn_param.exp = DEFAULT_EXP; + if (mode == DHD_PNO_BATCH_MODE) { + /* In case of BATCH SCAN */ + if (pno_params->params_batch.bestn) + pfn_param.bestn = pno_params->params_batch.bestn; + if (pno_params->params_batch.scan_fr) + pfn_param.scan_freq = htod32(pno_params->params_batch.scan_fr); + if (pno_params->params_batch.mscan) + pfn_param.mscan = pno_params->params_batch.mscan; + /* enable broadcast scan */ + pfn_param.flags |= (ENABLE << ENABLE_BD_SCAN_BIT); + } else if (mode == DHD_PNO_HOTLIST_MODE) { + /* In case of HOTLIST SCAN */ + if (pno_params->params_hotlist.scan_fr) + pfn_param.scan_freq = htod32(pno_params->params_hotlist.scan_fr); + pfn_param.bestn = 0; + pfn_param.repeat = 0; + /* enable broadcast scan */ + pfn_param.flags |= (ENABLE << ENABLE_BD_SCAN_BIT); + } + if (combined_scan) { + /* Disable Adaptive Scan */ + pfn_param.flags &= ~(htod16(ENABLE << ENABLE_ADAPTSCAN_BIT)); + pfn_param.flags |= (ENABLE << ENABLE_BD_SCAN_BIT); + pfn_param.repeat = 0; + pfn_param.exp = 0; + if (_pno_state->pno_mode & DHD_PNO_BATCH_MODE) { + /* In case of Legacy PNO + BATCH SCAN */ + _params = &(_pno_state->pno_params_arr[INDEX_OF_BATCH_PARAMS]); + if (_params->params_batch.bestn) + pfn_param.bestn = _params->params_batch.bestn; + if (_params->params_batch.scan_fr) + pfn_param.scan_freq = htod32(_params->params_batch.scan_fr); + if (_params->params_batch.mscan) + pfn_param.mscan = _params->params_batch.mscan; + } else if (_pno_state->pno_mode & DHD_PNO_HOTLIST_MODE) { + /* In case of Legacy PNO + HOTLIST SCAN */ + _params = &(_pno_state->pno_params_arr[INDEX_OF_HOTLIST_PARAMS]); + if (_params->params_hotlist.scan_fr) + pfn_param.scan_freq = htod32(_params->params_hotlist.scan_fr); + pfn_param.bestn = 0; + pfn_param.repeat = 0; + } + } + } + if (pfn_param.scan_freq < htod32(PNO_SCAN_MIN_FW_SEC) || + pfn_param.scan_freq > htod32(PNO_SCAN_MAX_FW_SEC)) { + DHD_ERROR(("%s pno freq(%d sec) is not valid \n", + __FUNCTION__, PNO_SCAN_MIN_FW_SEC)); + err = BCME_BADARG; + goto exit; + } + if (mode == DHD_PNO_BATCH_MODE) { + int _tmp = pfn_param.bestn; + /* set bestn to calculate the max mscan which firmware supports */ + err = dhd_iovar(dhd, 0, "pfnmem", (char *)&_tmp, sizeof(_tmp), 1); + if (err < 0) { + DHD_ERROR(("%s : failed to set pfnmem\n", __FUNCTION__)); + goto exit; + } + /* get max mscan which the firmware supports */ + err = dhd_iovar(dhd, 0, "pfnmem", (char *)&_tmp, sizeof(_tmp), 0); + if (err < 0) { + DHD_ERROR(("%s : failed to get pfnmem\n", __FUNCTION__)); + goto exit; + } + DHD_PNO((" returned mscan : %d, set bestn : %d\n", _tmp, pfn_param.bestn)); + pfn_param.mscan = MIN(pfn_param.mscan, _tmp); + } + err = dhd_iovar(dhd, 0, "pfn_set", (char *)&pfn_param, sizeof(pfn_param), 1); + if (err < 0) { + DHD_ERROR(("%s : failed to execute pfn_set\n", __FUNCTION__)); + goto exit; + } + /* need to return mscan if this is for batch scan instead of err */ + err = (mode == DHD_PNO_BATCH_MODE)? pfn_param.mscan : err; +exit: + return err; +} +static int +_dhd_pno_add_ssid(dhd_pub_t *dhd, wlc_ssid_t* ssids_list, int nssid) +{ + int err = BCME_OK; + int i = 0; + wl_pfn_t pfn_element; + NULL_CHECK(dhd, "dhd is NULL", err); + if (nssid) { + NULL_CHECK(ssids_list, "ssid list is NULL", err); + } + memset(&pfn_element, 0, sizeof(pfn_element)); + { + int j; + for (j = 0; j < nssid; j++) { + DHD_PNO(("%d: scan for %s size = %d\n", j, + ssids_list[j].SSID, ssids_list[j].SSID_len)); + } + } + /* Check for broadcast ssid */ + for (i = 0; i < nssid; i++) { + if (!ssids_list[i].SSID_len) { + DHD_ERROR(("%d: Broadcast SSID is ilegal for PNO setting\n", i)); + err = BCME_ERROR; + goto exit; + } + } + /* set all pfn ssid */ + for (i = 0; i < nssid; i++) { + pfn_element.infra = htod32(DOT11_BSSTYPE_INFRASTRUCTURE); + pfn_element.auth = (DOT11_OPEN_SYSTEM); + pfn_element.wpa_auth = htod32(WPA_AUTH_PFN_ANY); + pfn_element.wsec = htod32(0); + pfn_element.infra = htod32(1); + pfn_element.flags = htod32(ENABLE << WL_PFN_HIDDEN_BIT); + memcpy((char *)pfn_element.ssid.SSID, ssids_list[i].SSID, + ssids_list[i].SSID_len); + pfn_element.ssid.SSID_len = ssids_list[i].SSID_len; + err = dhd_iovar(dhd, 0, "pfn_add", (char *)&pfn_element, + sizeof(pfn_element), 1); + if (err < 0) { + DHD_ERROR(("%s : failed to execute pfn_add\n", __FUNCTION__)); + goto exit; + } + } +exit: + return err; +} +/* qsort compare function */ +static int +_dhd_pno_cmpfunc(const void *a, const void *b) +{ + return (*(uint16*)a - *(uint16*)b); +} +static int +_dhd_pno_chan_merge(uint16 *d_chan_list, int *nchan, + uint16 *chan_list1, int nchan1, uint16 *chan_list2, int nchan2) +{ + int err = BCME_OK; + int i = 0, j = 0, k = 0; + uint16 tmp; + NULL_CHECK(d_chan_list, "d_chan_list is NULL", err); + NULL_CHECK(nchan, "nchan is NULL", err); + NULL_CHECK(chan_list1, "chan_list1 is NULL", err); + NULL_CHECK(chan_list2, "chan_list2 is NULL", err); + /* chan_list1 and chan_list2 should be sorted at first */ + while (i < nchan1 && j < nchan2) { + tmp = chan_list1[i] < chan_list2[j]? + chan_list1[i++] : chan_list2[j++]; + for (; i < nchan1 && chan_list1[i] == tmp; i++); + for (; j < nchan2 && chan_list2[j] == tmp; j++); + d_chan_list[k++] = tmp; + } + + while (i < nchan1) { + tmp = chan_list1[i++]; + for (; i < nchan1 && chan_list1[i] == tmp; i++); + d_chan_list[k++] = tmp; + } + + while (j < nchan2) { + tmp = chan_list2[j++]; + for (; j < nchan2 && chan_list2[j] == tmp; j++); + d_chan_list[k++] = tmp; + + } + *nchan = k; + return err; +} +static int +_dhd_pno_get_channels(dhd_pub_t *dhd, uint16 *d_chan_list, + int *nchan, uint8 band, bool skip_dfs) +{ + int err = BCME_OK; + int i, j; + uint32 chan_buf[WL_NUMCHANNELS + 1]; + wl_uint32_list_t *list; + NULL_CHECK(dhd, "dhd is NULL", err); + if (*nchan) { + NULL_CHECK(d_chan_list, "d_chan_list is NULL", err); + } + list = (wl_uint32_list_t *) (void *)chan_buf; + list->count = htod32(WL_NUMCHANNELS); + err = dhd_wl_ioctl_cmd(dhd, WLC_GET_VALID_CHANNELS, chan_buf, sizeof(chan_buf), FALSE, 0); + if (err < 0) { + DHD_ERROR(("failed to get channel list (err: %d)\n", err)); + goto exit; + } + for (i = 0, j = 0; i < dtoh32(list->count) && i < *nchan; i++) { + if (band == WLC_BAND_2G) { + if (dtoh32(list->element[i]) > CHANNEL_2G_MAX) + continue; + } else if (band == WLC_BAND_5G) { + if (dtoh32(list->element[i]) <= CHANNEL_2G_MAX) + continue; + if (skip_dfs && is_dfs(dtoh32(list->element[i]))) + continue; + + } else { /* All channels */ + if (skip_dfs && is_dfs(dtoh32(list->element[i]))) + continue; + } + d_chan_list[j++] = dtoh32(list->element[i]); + } + *nchan = j; +exit: + return err; +} +static int +_dhd_pno_convert_format(dhd_pub_t *dhd, struct dhd_pno_batch_params *params_batch, + char *buf, int nbufsize) +{ + int err = BCME_OK; + int bytes_written = 0, nreadsize = 0; + int t_delta = 0; + int nleftsize = nbufsize; + uint8 cnt = 0; + char *bp = buf; + char eabuf[ETHER_ADDR_STR_LEN]; +#ifdef PNO_DEBUG + char *_base_bp; + char msg[150]; +#endif + dhd_pno_bestnet_entry_t *iter, *next; + dhd_pno_scan_results_t *siter, *snext; + dhd_pno_best_header_t *phead, *pprev; + NULL_CHECK(params_batch, "params_batch is NULL", err); + if (nbufsize > 0) + NULL_CHECK(buf, "buf is NULL", err); + /* initialize the buffer */ + memset(buf, 0, nbufsize); + DHD_PNO(("%s enter \n", __FUNCTION__)); + /* # of scans */ + if (!params_batch->get_batch.batch_started) { + bp += nreadsize = sprintf(bp, "scancount=%d\n", + params_batch->get_batch.expired_tot_scan_cnt); + nleftsize -= nreadsize; + params_batch->get_batch.batch_started = TRUE; + } + DHD_PNO(("%s scancount %d\n", __FUNCTION__, params_batch->get_batch.expired_tot_scan_cnt)); + /* preestimate scan count until which scan result this report is going to end */ + list_for_each_entry_safe(siter, snext, + ¶ms_batch->get_batch.expired_scan_results_list, list) { + phead = siter->bestnetheader; + while (phead != NULL) { + /* if left_size is less than bestheader total size , stop this */ + if (nleftsize <= + (phead->tot_size + phead->tot_cnt * ENTRY_OVERHEAD)) + goto exit; + /* increase scan count */ + cnt++; + /* # best of each scan */ + DHD_PNO(("\n\n", cnt - 1, phead->tot_cnt)); + /* attribute of the scan */ + if (phead->reason & PNO_STATUS_ABORT_MASK) { + bp += nreadsize = sprintf(bp, "trunc\n"); + nleftsize -= nreadsize; + } + list_for_each_entry_safe(iter, next, + &phead->entry_list, list) { + t_delta = jiffies_to_msecs(jiffies - iter->recorded_time); +#ifdef PNO_DEBUG + _base_bp = bp; + memset(msg, 0, sizeof(msg)); +#endif + /* BSSID info */ + bp += nreadsize = sprintf(bp, "bssid=%s\n", + bcm_ether_ntoa((const struct ether_addr *)&iter->BSSID, eabuf)); + nleftsize -= nreadsize; + /* SSID */ + bp += nreadsize = sprintf(bp, "ssid=%s\n", iter->SSID); + nleftsize -= nreadsize; + /* channel */ + bp += nreadsize = sprintf(bp, "freq=%d\n", + wf_channel2mhz(iter->channel, + iter->channel <= CH_MAX_2G_CHANNEL? + WF_CHAN_FACTOR_2_4_G : WF_CHAN_FACTOR_5_G)); + nleftsize -= nreadsize; + /* RSSI */ + bp += nreadsize = sprintf(bp, "level=%d\n", iter->RSSI); + nleftsize -= nreadsize; + /* add the time consumed in Driver to the timestamp of firmware */ + iter->timestamp += t_delta; + bp += nreadsize = sprintf(bp, "age=%d\n", iter->timestamp); + nleftsize -= nreadsize; + /* RTT0 */ + bp += nreadsize = sprintf(bp, "dist=%d\n", + (iter->rtt0 == 0)? -1 : iter->rtt0); + nleftsize -= nreadsize; + /* RTT1 */ + bp += nreadsize = sprintf(bp, "distSd=%d\n", + (iter->rtt0 == 0)? -1 : iter->rtt1); + nleftsize -= nreadsize; + bp += nreadsize = sprintf(bp, "%s", AP_END_MARKER); + nleftsize -= nreadsize; + list_del(&iter->list); + MFREE(dhd->osh, iter, BESTNET_ENTRY_SIZE); +#ifdef PNO_DEBUG + memcpy(msg, _base_bp, bp - _base_bp); + DHD_PNO(("Entry : \n%s", msg)); +#endif + } + bp += nreadsize = sprintf(bp, "%s", SCAN_END_MARKER); + DHD_PNO(("%s", SCAN_END_MARKER)); + nleftsize -= nreadsize; + pprev = phead; + /* reset the header */ + siter->bestnetheader = phead = phead->next; + MFREE(dhd->osh, pprev, BEST_HEADER_SIZE); + + siter->cnt_header--; + } + if (phead == NULL) { + /* we store all entry in this scan , so it is ok to delete */ + list_del(&siter->list); + MFREE(dhd->osh, siter, SCAN_RESULTS_SIZE); + } + } +exit: + if (cnt < params_batch->get_batch.expired_tot_scan_cnt) { + DHD_ERROR(("Buffer size is small to save all batch entry," + " cnt : %d (remained_scan_cnt): %d\n", + cnt, params_batch->get_batch.expired_tot_scan_cnt - cnt)); + } + params_batch->get_batch.expired_tot_scan_cnt -= cnt; + /* set FALSE only if the link list is empty after returning the data */ + if (list_empty(¶ms_batch->get_batch.expired_scan_results_list)) { + params_batch->get_batch.batch_started = FALSE; + bp += sprintf(bp, "%s", RESULTS_END_MARKER); + DHD_PNO(("%s", RESULTS_END_MARKER)); + DHD_PNO(("%s : Getting the batching data is complete\n", __FUNCTION__)); + } + /* return used memory in buffer */ + bytes_written = (int32)(bp - buf); + return bytes_written; +} +static int +_dhd_pno_clear_all_batch_results(dhd_pub_t *dhd, struct list_head *head, bool only_last) +{ + int err = BCME_OK; + int removed_scan_cnt = 0; + dhd_pno_scan_results_t *siter, *snext; + dhd_pno_best_header_t *phead, *pprev; + dhd_pno_bestnet_entry_t *iter, *next; + NULL_CHECK(dhd, "dhd is NULL", err); + NULL_CHECK(head, "head is NULL", err); + NULL_CHECK(head->next, "head->next is NULL", err); + DHD_PNO(("%s enter\n", __FUNCTION__)); + list_for_each_entry_safe(siter, snext, + head, list) { + if (only_last) { + /* in case that we need to delete only last one */ + if (!list_is_last(&siter->list, head)) { + /* skip if the one is not last */ + continue; + } + } + /* delete all data belong if the one is last */ + phead = siter->bestnetheader; + while (phead != NULL) { + removed_scan_cnt++; + list_for_each_entry_safe(iter, next, + &phead->entry_list, list) { + list_del(&iter->list); + MFREE(dhd->osh, iter, BESTNET_ENTRY_SIZE); + } + pprev = phead; + phead = phead->next; + MFREE(dhd->osh, pprev, BEST_HEADER_SIZE); + } + if (phead == NULL) { + /* it is ok to delete top node */ + list_del(&siter->list); + MFREE(dhd->osh, siter, SCAN_RESULTS_SIZE); + } + } + return removed_scan_cnt; +} + +static int +_dhd_pno_cfg(dhd_pub_t *dhd, uint16 *channel_list, int nchan) +{ + int err = BCME_OK; + int i = 0; + wl_pfn_cfg_t pfncfg_param; + NULL_CHECK(dhd, "dhd is NULL", err); + if (nchan) { + NULL_CHECK(channel_list, "nchan is NULL", err); + } + DHD_PNO(("%s enter : nchan : %d\n", __FUNCTION__, nchan)); + memset(&pfncfg_param, 0, sizeof(wl_pfn_cfg_t)); + /* Setup default values */ + pfncfg_param.reporttype = htod32(WL_PFN_REPORT_ALLNET); + pfncfg_param.channel_num = htod32(0); + + for (i = 0; i < nchan && nchan < WL_NUMCHANNELS; i++) + pfncfg_param.channel_list[i] = channel_list[i]; + + pfncfg_param.channel_num = htod32(nchan); + err = dhd_iovar(dhd, 0, "pfn_cfg", (char *)&pfncfg_param, sizeof(pfncfg_param), 1); + if (err < 0) { + DHD_ERROR(("%s : failed to execute pfn_cfg\n", __FUNCTION__)); + goto exit; + } +exit: + return err; +} +static int +_dhd_pno_reinitialize_prof(dhd_pub_t *dhd, dhd_pno_params_t *params, dhd_pno_mode_t mode) +{ + int err = BCME_OK; + dhd_pno_status_info_t *_pno_state; + NULL_CHECK(dhd, "dhd is NULL\n", err); + NULL_CHECK(dhd->pno_state, "pno_state is NULL\n", err); + DHD_PNO(("%s enter\n", __FUNCTION__)); + _pno_state = PNO_GET_PNOSTATE(dhd); + mutex_lock(&_pno_state->pno_mutex); + switch (mode) { + case DHD_PNO_LEGACY_MODE: { + struct dhd_pno_ssid *iter, *next; + if (params->params_legacy.nssid > 0) { + list_for_each_entry_safe(iter, next, + ¶ms->params_legacy.ssid_list, list) { + list_del(&iter->list); + kfree(iter); + } + } + params->params_legacy.scan_fr = 0; + params->params_legacy.pno_freq_expo_max = 0; + params->params_legacy.pno_repeat = 0; + params->params_legacy.nchan = 0; + memset(params->params_legacy.chan_list, 0, + sizeof(params->params_legacy.chan_list)); + break; + } + case DHD_PNO_BATCH_MODE: { + params->params_batch.scan_fr = 0; + params->params_batch.mscan = 0; + params->params_batch.nchan = 0; + params->params_batch.rtt = 0; + params->params_batch.bestn = 0; + params->params_batch.nchan = 0; + params->params_batch.band = WLC_BAND_AUTO; + memset(params->params_batch.chan_list, 0, + sizeof(params->params_batch.chan_list)); + params->params_batch.get_batch.batch_started = FALSE; + params->params_batch.get_batch.buf = NULL; + params->params_batch.get_batch.bufsize = 0; + params->params_batch.get_batch.reason = 0; + _dhd_pno_clear_all_batch_results(dhd, + ¶ms->params_batch.get_batch.scan_results_list, FALSE); + _dhd_pno_clear_all_batch_results(dhd, + ¶ms->params_batch.get_batch.expired_scan_results_list, FALSE); + params->params_batch.get_batch.tot_scan_cnt = 0; + params->params_batch.get_batch.expired_tot_scan_cnt = 0; + params->params_batch.get_batch.top_node_cnt = 0; + INIT_LIST_HEAD(¶ms->params_batch.get_batch.scan_results_list); + INIT_LIST_HEAD(¶ms->params_batch.get_batch.expired_scan_results_list); + break; + } + case DHD_PNO_HOTLIST_MODE: { + struct dhd_pno_bssid *iter, *next; + if (params->params_hotlist.nbssid > 0) { + list_for_each_entry_safe(iter, next, + ¶ms->params_hotlist.bssid_list, list) { + list_del(&iter->list); + kfree(iter); + } + } + params->params_hotlist.scan_fr = 0; + params->params_hotlist.nbssid = 0; + params->params_hotlist.nchan = 0; + params->params_batch.band = WLC_BAND_AUTO; + memset(params->params_hotlist.chan_list, 0, + sizeof(params->params_hotlist.chan_list)); + break; + } + default: + DHD_ERROR(("%s : unknown mode : %d\n", __FUNCTION__, mode)); + break; + } + mutex_unlock(&_pno_state->pno_mutex); + return err; +} +static int +_dhd_pno_add_bssid(dhd_pub_t *dhd, wl_pfn_bssid_t *p_pfn_bssid, int nbssid) +{ + int err = BCME_OK; + NULL_CHECK(dhd, "dhd is NULL", err); + if (nbssid) { + NULL_CHECK(p_pfn_bssid, "bssid list is NULL", err); + } + err = dhd_iovar(dhd, 0, "pfn_add_bssid", (char *)&p_pfn_bssid, + sizeof(wl_pfn_bssid_t) * nbssid, 1); + if (err < 0) { + DHD_ERROR(("%s : failed to execute pfn_cfg\n", __FUNCTION__)); + goto exit; + } +exit: + return err; +} +int +dhd_pno_stop_for_ssid(dhd_pub_t *dhd) +{ + int err = BCME_OK; + uint32 mode = 0; + dhd_pno_status_info_t *_pno_state; + dhd_pno_params_t *_params; + wl_pfn_bssid_t *p_pfn_bssid; + NULL_CHECK(dhd, "dev is NULL", err); + NULL_CHECK(dhd->pno_state, "pno_state is NULL", err); + _pno_state = PNO_GET_PNOSTATE(dhd); + if (!(_pno_state->pno_mode & DHD_PNO_LEGACY_MODE)) { + DHD_ERROR(("%s : LEGACY PNO MODE is not enabled\n", __FUNCTION__)); + goto exit; + } + DHD_PNO(("%s enter\n", __FUNCTION__)); + _pno_state->pno_mode &= ~DHD_PNO_LEGACY_MODE; + /* restart Batch mode if the batch mode is on */ + if (_pno_state->pno_mode & (DHD_PNO_BATCH_MODE | DHD_PNO_HOTLIST_MODE)) { + /* retrieve the batching data from firmware into host */ + dhd_pno_get_for_batch(dhd, NULL, 0, PNO_STATUS_DISABLE); + /* save current pno_mode before calling dhd_pno_clean */ + mode = _pno_state->pno_mode; + dhd_pno_clean(dhd); + /* restore previous pno_mode */ + _pno_state->pno_mode = mode; + if (_pno_state->pno_mode & DHD_PNO_BATCH_MODE) { + _params = &(_pno_state->pno_params_arr[INDEX_OF_BATCH_PARAMS]); + /* restart BATCH SCAN */ + err = dhd_pno_set_for_batch(dhd, &_params->params_batch); + if (err < 0) { + _pno_state->pno_mode &= ~DHD_PNO_BATCH_MODE; + DHD_ERROR(("%s : failed to restart batch scan(err: %d)\n", + __FUNCTION__, err)); + goto exit; + } + } else if (_pno_state->pno_mode & DHD_PNO_HOTLIST_MODE) { + /* restart HOTLIST SCAN */ + struct dhd_pno_bssid *iter, *next; + _params = &(_pno_state->pno_params_arr[INDEX_OF_HOTLIST_PARAMS]); + p_pfn_bssid = kzalloc(sizeof(wl_pfn_bssid_t) * + _params->params_hotlist.nbssid, GFP_KERNEL); + if (p_pfn_bssid == NULL) { + DHD_ERROR(("%s : failed to allocate wl_pfn_bssid_t array" + " (count: %d)", + __FUNCTION__, _params->params_hotlist.nbssid)); + err = BCME_ERROR; + _pno_state->pno_mode &= ~DHD_PNO_HOTLIST_MODE; + goto exit; + } + /* convert dhd_pno_bssid to wl_pfn_bssid */ + list_for_each_entry_safe(iter, next, + &_params->params_hotlist.bssid_list, list) { + memcpy(&p_pfn_bssid->macaddr, + &iter->macaddr, ETHER_ADDR_LEN); + p_pfn_bssid->flags = iter->flags; + p_pfn_bssid++; + } + err = dhd_pno_set_for_hotlist(dhd, p_pfn_bssid, &_params->params_hotlist); + if (err < 0) { + _pno_state->pno_mode &= ~DHD_PNO_HOTLIST_MODE; + DHD_ERROR(("%s : failed to restart hotlist scan(err: %d)\n", + __FUNCTION__, err)); + goto exit; + } + } + } else { + err = dhd_pno_clean(dhd); + if (err < 0) { + DHD_ERROR(("%s : failed to call dhd_pno_clean (err: %d)\n", + __FUNCTION__, err)); + goto exit; + } + } +exit: + return err; +} + +int +dhd_pno_enable(dhd_pub_t *dhd, int enable) +{ + int err = BCME_OK; + NULL_CHECK(dhd, "dhd is NULL", err); + DHD_PNO(("%s enter\n", __FUNCTION__)); + return (_dhd_pno_enable(dhd, enable)); +} + +int +dhd_pno_set_for_ssid(dhd_pub_t *dhd, wlc_ssid_t* ssid_list, int nssid, + uint16 scan_fr, int pno_repeat, int pno_freq_expo_max, uint16 *channel_list, int nchan) +{ + struct dhd_pno_ssid *_pno_ssid; + dhd_pno_params_t *_params; + dhd_pno_params_t *_params2; + dhd_pno_status_info_t *_pno_state; + uint16 _chan_list[WL_NUMCHANNELS]; + int32 tot_nchan = 0; + int err = BCME_OK; + int i; + int mode = 0; + NULL_CHECK(dhd, "dhd is NULL", err); + NULL_CHECK(dhd->pno_state, "pno_state is NULL", err); + _pno_state = PNO_GET_PNOSTATE(dhd); + + if (!dhd_support_sta_mode(dhd)) { + err = BCME_BADOPTION; + goto exit; + } + DHD_PNO(("%s enter : scan_fr :%d, pno_repeat :%d," + "pno_freq_expo_max: %d, nchan :%d\n", __FUNCTION__, + scan_fr, pno_repeat, pno_freq_expo_max, nchan)); + + _params = &(_pno_state->pno_params_arr[INDEX_OF_LEGACY_PARAMS]); + if (_pno_state->pno_mode & DHD_PNO_LEGACY_MODE) { + DHD_ERROR(("%s : Legacy PNO mode was already started, " + "will disable previous one to start new one\n", __FUNCTION__)); + err = dhd_pno_stop_for_ssid(dhd); + if (err < 0) { + DHD_ERROR(("%s : failed to stop legacy PNO (err %d)\n", + __FUNCTION__, err)); + goto exit; + } + } + _pno_state->pno_mode |= DHD_PNO_LEGACY_MODE; + err = _dhd_pno_reinitialize_prof(dhd, _params, DHD_PNO_LEGACY_MODE); + if (err < 0) { + DHD_ERROR(("%s : failed to reinitialize profile (err %d)\n", + __FUNCTION__, err)); + goto exit; + } + memset(_chan_list, 0, sizeof(_chan_list)); + tot_nchan = nchan; + if (tot_nchan > 0 && channel_list) { + for (i = 0; i < nchan; i++) + _params->params_legacy.chan_list[i] = _chan_list[i] = channel_list[i]; + } + if (_pno_state->pno_mode & (DHD_PNO_BATCH_MODE | DHD_PNO_HOTLIST_MODE)) { + DHD_PNO(("BATCH SCAN is on progress in firmware\n")); + /* retrieve the batching data from firmware into host */ + dhd_pno_get_for_batch(dhd, NULL, 0, PNO_STATUS_DISABLE); + /* store current pno_mode before disabling pno */ + mode = _pno_state->pno_mode; + err = _dhd_pno_enable(dhd, PNO_OFF); + if (err < 0) { + DHD_ERROR(("%s : failed to disable PNO\n", __FUNCTION__)); + goto exit; + } + /* restore the previous mode */ + _pno_state->pno_mode = mode; + /* use superset of channel list between two mode */ + if (_pno_state->pno_mode & DHD_PNO_BATCH_MODE) { + _params2 = &(_pno_state->pno_params_arr[INDEX_OF_BATCH_PARAMS]); + if (_params2->params_batch.nchan > 0 && nchan > 0) { + err = _dhd_pno_chan_merge(_chan_list, &tot_nchan, + &_params2->params_batch.chan_list[0], + _params2->params_batch.nchan, + &channel_list[0], nchan); + if (err < 0) { + DHD_ERROR(("%s : failed to merge channel list" + " between legacy and batch\n", + __FUNCTION__)); + goto exit; + } + } else { + DHD_PNO(("superset channel will use" + " all channels in firmware\n")); + } + } else if (_pno_state->pno_mode & DHD_PNO_HOTLIST_MODE) { + _params2 = &(_pno_state->pno_params_arr[INDEX_OF_HOTLIST_PARAMS]); + if (_params2->params_hotlist.nchan > 0 && nchan > 0) { + err = _dhd_pno_chan_merge(_chan_list, &tot_nchan, + &_params2->params_hotlist.chan_list[0], + _params2->params_hotlist.nchan, + &channel_list[0], nchan); + if (err < 0) { + DHD_ERROR(("%s : failed to merge channel list" + " between legacy and hotlist\n", + __FUNCTION__)); + goto exit; + } + } + } + } + _params->params_legacy.scan_fr = scan_fr; + _params->params_legacy.pno_repeat = pno_repeat; + _params->params_legacy.pno_freq_expo_max = pno_freq_expo_max; + _params->params_legacy.nchan = nchan; + _params->params_legacy.nssid = nssid; + INIT_LIST_HEAD(&_params->params_legacy.ssid_list); + if ((err = _dhd_pno_set(dhd, _params, DHD_PNO_LEGACY_MODE)) < 0) { + DHD_ERROR(("failed to set call pno_set (err %d) in firmware\n", err)); + goto exit; + } + if ((err = _dhd_pno_add_ssid(dhd, ssid_list, nssid)) < 0) { + DHD_ERROR(("failed to add ssid list(err %d), %d in firmware\n", err, nssid)); + goto exit; + } + for (i = 0; i < nssid; i++) { + _pno_ssid = kzalloc(sizeof(struct dhd_pno_ssid), GFP_KERNEL); + if (_pno_ssid == NULL) { + DHD_ERROR(("%s : failed to allocate struct dhd_pno_ssid\n", + __FUNCTION__)); + goto exit; + } + _pno_ssid->SSID_len = ssid_list[i].SSID_len; + memcpy(_pno_ssid->SSID, ssid_list[i].SSID, _pno_ssid->SSID_len); + list_add_tail(&_pno_ssid->list, &_params->params_legacy.ssid_list); + + } + if (tot_nchan > 0) { + if ((err = _dhd_pno_cfg(dhd, _chan_list, tot_nchan)) < 0) { + DHD_ERROR(("%s : failed to set call pno_cfg (err %d) in firmware\n", + __FUNCTION__, err)); + goto exit; + } + } + if (_pno_state->pno_status == DHD_PNO_DISABLED) { + if ((err = _dhd_pno_enable(dhd, PNO_ON)) < 0) + DHD_ERROR(("%s : failed to enable PNO\n", __FUNCTION__)); + } +exit: + /* clear mode in case of error */ + if (err < 0) + _pno_state->pno_mode &= ~DHD_PNO_LEGACY_MODE; + return err; +} +int +dhd_pno_set_for_batch(dhd_pub_t *dhd, struct dhd_pno_batch_params *batch_params) +{ + int err = BCME_OK; + uint16 _chan_list[WL_NUMCHANNELS]; + int rem_nchan = 0, tot_nchan = 0; + int mode = 0, mscan = 0; + int i = 0; + dhd_pno_params_t *_params; + dhd_pno_params_t *_params2; + dhd_pno_status_info_t *_pno_state; + wlc_ssid_t *p_ssid_list = NULL; + NULL_CHECK(dhd, "dhd is NULL", err); + NULL_CHECK(dhd->pno_state, "pno_state is NULL", err); + NULL_CHECK(batch_params, "batch_params is NULL", err); + _pno_state = PNO_GET_PNOSTATE(dhd); + DHD_PNO(("%s enter\n", __FUNCTION__)); + if (!dhd_support_sta_mode(dhd)) { + err = BCME_BADOPTION; + goto exit; + } + if (!WLS_SUPPORTED(_pno_state)) { + DHD_ERROR(("%s : wifi location service is not supported\n", __FUNCTION__)); + err = BCME_UNSUPPORTED; + goto exit; + } + _params = &_pno_state->pno_params_arr[INDEX_OF_BATCH_PARAMS]; + if (!(_pno_state->pno_mode & DHD_PNO_BATCH_MODE)) { + _pno_state->pno_mode |= DHD_PNO_BATCH_MODE; + err = _dhd_pno_reinitialize_prof(dhd, _params, DHD_PNO_BATCH_MODE); + if (err < 0) { + DHD_ERROR(("%s : failed to call _dhd_pno_reinitialize_prof\n", + __FUNCTION__)); + goto exit; + } + } else { + /* batch mode is already started */ + return -EBUSY; + } + _params->params_batch.scan_fr = batch_params->scan_fr; + _params->params_batch.bestn = batch_params->bestn; + _params->params_batch.mscan = (batch_params->mscan)? + batch_params->mscan : DEFAULT_BATCH_MSCAN; + _params->params_batch.nchan = batch_params->nchan; + memcpy(_params->params_batch.chan_list, batch_params->chan_list, + sizeof(_params->params_batch.chan_list)); + + memset(_chan_list, 0, sizeof(_chan_list)); + + rem_nchan = ARRAYSIZE(batch_params->chan_list) - batch_params->nchan; + if (batch_params->band == WLC_BAND_2G || batch_params->band == WLC_BAND_5G) { + /* get a valid channel list based on band B or A */ + err = _dhd_pno_get_channels(dhd, + &_params->params_batch.chan_list[batch_params->nchan], + &rem_nchan, batch_params->band, FALSE); + if (err < 0) { + DHD_ERROR(("%s: failed to get valid channel list(band : %d)\n", + __FUNCTION__, batch_params->band)); + goto exit; + } + /* now we need to update nchan because rem_chan has valid channel count */ + _params->params_batch.nchan += rem_nchan; + /* need to sort channel list */ + sort(_params->params_batch.chan_list, _params->params_batch.nchan, + sizeof(_params->params_batch.chan_list[0]), _dhd_pno_cmpfunc, NULL); + } +#ifdef PNO_DEBUG +{ + DHD_PNO(("Channel list : ")); + for (i = 0; i < _params->params_batch.nchan; i++) { + DHD_PNO(("%d ", _params->params_batch.chan_list[i])); + } + DHD_PNO(("\n")); +} +#endif + if (_params->params_batch.nchan) { + /* copy the channel list into local array */ + memcpy(_chan_list, _params->params_batch.chan_list, sizeof(_chan_list)); + tot_nchan = _params->params_batch.nchan; + } + if (_pno_state->pno_mode & DHD_PNO_LEGACY_MODE) { + struct dhd_pno_ssid *iter, *next; + DHD_PNO(("PNO SSID is on progress in firmware\n")); + /* store current pno_mode before disabling pno */ + mode = _pno_state->pno_mode; + err = _dhd_pno_enable(dhd, PNO_OFF); + if (err < 0) { + DHD_ERROR(("%s : failed to disable PNO\n", __FUNCTION__)); + goto exit; + } + /* restore the previous mode */ + _pno_state->pno_mode = mode; + /* Use the superset for channelist between two mode */ + _params2 = &(_pno_state->pno_params_arr[INDEX_OF_LEGACY_PARAMS]); + if (_params2->params_legacy.nchan > 0 && _params->params_batch.nchan > 0) { + err = _dhd_pno_chan_merge(_chan_list, &tot_nchan, + &_params2->params_legacy.chan_list[0], + _params2->params_legacy.nchan, + &_params->params_batch.chan_list[0], _params->params_batch.nchan); + if (err < 0) { + DHD_ERROR(("%s : failed to merge channel list" + " between legacy and batch\n", + __FUNCTION__)); + goto exit; + } + } else { + DHD_PNO(("superset channel will use all channels in firmware\n")); + } + p_ssid_list = kzalloc(sizeof(wlc_ssid_t) * + _params2->params_legacy.nssid, GFP_KERNEL); + if (p_ssid_list == NULL) { + DHD_ERROR(("%s : failed to allocate wlc_ssid_t array (count: %d)", + __FUNCTION__, _params2->params_legacy.nssid)); + err = BCME_ERROR; + _pno_state->pno_mode &= ~DHD_PNO_LEGACY_MODE; + goto exit; + } + i = 0; + /* convert dhd_pno_ssid to dhd_pno_ssid */ + list_for_each_entry_safe(iter, next, &_params2->params_legacy.ssid_list, list) { + p_ssid_list[i].SSID_len = iter->SSID_len; + memcpy(p_ssid_list->SSID, iter->SSID, p_ssid_list[i].SSID_len); + i++; + } + if ((err = _dhd_pno_add_ssid(dhd, p_ssid_list, + _params2->params_legacy.nssid)) < 0) { + DHD_ERROR(("failed to add ssid list (err %d) in firmware\n", err)); + goto exit; + } + } + if ((err = _dhd_pno_set(dhd, _params, DHD_PNO_BATCH_MODE)) < 0) { + DHD_ERROR(("%s : failed to set call pno_set (err %d) in firmware\n", + __FUNCTION__, err)); + goto exit; + } else { + /* we need to return mscan */ + mscan = err; + } + if (tot_nchan > 0) { + if ((err = _dhd_pno_cfg(dhd, _chan_list, tot_nchan)) < 0) { + DHD_ERROR(("%s : failed to set call pno_cfg (err %d) in firmware\n", + __FUNCTION__, err)); + goto exit; + } + } + if (_pno_state->pno_status == DHD_PNO_DISABLED) { + if ((err = _dhd_pno_enable(dhd, PNO_ON)) < 0) + DHD_ERROR(("%s : failed to enable PNO\n", __FUNCTION__)); + } +exit: + /* clear mode in case of error */ + if (err < 0) + _pno_state->pno_mode &= ~DHD_PNO_BATCH_MODE; + else { + /* return #max scan firmware can do */ + err = mscan; + } + if (p_ssid_list) + kfree(p_ssid_list); + return err; +} + +static int +_dhd_pno_get_for_batch(dhd_pub_t *dhd, char *buf, int bufsize, int reason) +{ + int err = BCME_OK; + int i, j; + uint32 timestamp = 0; + dhd_pno_params_t *_params = NULL; + dhd_pno_status_info_t *_pno_state = NULL; + wl_pfn_lscanresults_t *plbestnet = NULL; + wl_pfn_lnet_info_t *plnetinfo; + dhd_pno_bestnet_entry_t *pbestnet_entry; + dhd_pno_best_header_t *pbestnetheader = NULL; + dhd_pno_scan_results_t *pscan_results = NULL, *siter, *snext; + bool allocate_header = FALSE; + NULL_CHECK(dhd, "dhd is NULL", err); + NULL_CHECK(dhd->pno_state, "pno_state is NULL", err); + if (!dhd_support_sta_mode(dhd)) { + err = BCME_BADOPTION; + goto exit; + } + DHD_PNO(("%s enter\n", __FUNCTION__)); + _pno_state = PNO_GET_PNOSTATE(dhd); + + if (!WLS_SUPPORTED(_pno_state)) { + DHD_ERROR(("%s : wifi location service is not supported\n", __FUNCTION__)); + err = BCME_UNSUPPORTED; + goto exit; + } + if (!(_pno_state->pno_mode & DHD_PNO_BATCH_MODE)) { + DHD_ERROR(("%s: Batching SCAN mode is not enabled\n", __FUNCTION__)); + goto exit; + } + mutex_lock(&_pno_state->pno_mutex); + _params = &_pno_state->pno_params_arr[INDEX_OF_BATCH_PARAMS]; + if (buf && bufsize) { + if (!list_empty(&_params->params_batch.get_batch.expired_scan_results_list)) { + /* need to check whether we have cashed data or not */ + DHD_PNO(("%s: have cashed batching data in Driver\n", + __FUNCTION__)); + /* convert to results format */ + goto convert_format; + } else { + /* this is a first try to get batching results */ + if (!list_empty(&_params->params_batch.get_batch.scan_results_list)) { + /* move the scan_results_list to expired_scan_results_lists */ + list_for_each_entry_safe(siter, snext, + &_params->params_batch.get_batch.scan_results_list, list) { + list_move_tail(&siter->list, + &_params->params_batch.get_batch.expired_scan_results_list); + } + _params->params_batch.get_batch.top_node_cnt = 0; + _params->params_batch.get_batch.expired_tot_scan_cnt = + _params->params_batch.get_batch.tot_scan_cnt; + _params->params_batch.get_batch.tot_scan_cnt = 0; + goto convert_format; + } + } + } + /* create dhd_pno_scan_results_t whenever we got event WLC_E_PFN_BEST_BATCHING */ + pscan_results = (dhd_pno_scan_results_t *)MALLOC(dhd->osh, SCAN_RESULTS_SIZE); + if (pscan_results == NULL) { + err = BCME_NOMEM; + DHD_ERROR(("failed to allocate dhd_pno_scan_results_t\n")); + goto exit; + } + pscan_results->bestnetheader = NULL; + pscan_results->cnt_header = 0; + /* add the element into list unless total node cnt is less than MAX_NODE_ CNT */ + if (_params->params_batch.get_batch.top_node_cnt < MAX_NODE_CNT) { + list_add(&pscan_results->list, &_params->params_batch.get_batch.scan_results_list); + _params->params_batch.get_batch.top_node_cnt++; + } else { + int _removed_scan_cnt; + /* remove oldest one and add new one */ + DHD_PNO(("%s : Remove oldest node and add new one\n", __FUNCTION__)); + _removed_scan_cnt = _dhd_pno_clear_all_batch_results(dhd, + &_params->params_batch.get_batch.scan_results_list, TRUE); + _params->params_batch.get_batch.tot_scan_cnt -= _removed_scan_cnt; + list_add(&pscan_results->list, &_params->params_batch.get_batch.scan_results_list); + + } + plbestnet = (wl_pfn_lscanresults_t *)MALLOC(dhd->osh, PNO_BESTNET_LEN); + NULL_CHECK(plbestnet, "failed to allocate buffer for bestnet", err); + DHD_PNO(("%s enter\n", __FUNCTION__)); + memset(plbestnet, 0, PNO_BESTNET_LEN); + while (plbestnet->status != PFN_COMPLETE) { + memset(plbestnet, 0, PNO_BESTNET_LEN); + err = dhd_iovar(dhd, 0, "pfnlbest", (char *)plbestnet, PNO_BESTNET_LEN, 0); + if (err < 0) { + if (err == BCME_EPERM) { + DHD_ERROR(("we cannot get the batching data " + "during scanning in firmware, try again\n,")); + msleep(500); + continue; + } else { + DHD_ERROR(("%s : failed to execute pfnlbest (err :%d)\n", + __FUNCTION__, err)); + goto exit; + } + } + DHD_PNO(("ver %d, status : %d, count %d\n", plbestnet->version, + plbestnet->status, plbestnet->count)); + if (plbestnet->version != PFN_SCANRESULT_VERSION) { + err = BCME_VERSION; + DHD_ERROR(("bestnet version(%d) is mismatch with Driver version(%d)\n", + plbestnet->version, PFN_SCANRESULT_VERSION)); + goto exit; + } + plnetinfo = plbestnet->netinfo; + for (i = 0; i < plbestnet->count; i++) { + pbestnet_entry = (dhd_pno_bestnet_entry_t *) + MALLOC(dhd->osh, BESTNET_ENTRY_SIZE); + if (pbestnet_entry == NULL) { + err = BCME_NOMEM; + DHD_ERROR(("failed to allocate dhd_pno_bestnet_entry\n")); + goto exit; + } + memset(pbestnet_entry, 0, BESTNET_ENTRY_SIZE); + pbestnet_entry->recorded_time = jiffies; /* record the current time */ + /* create header for the first entry */ + allocate_header = (i == 0)? TRUE : FALSE; + /* check whether the new generation is started or not */ + if (timestamp && (TIME_DIFF(timestamp, plnetinfo->timestamp) + > TIME_MIN_DIFF)) + allocate_header = TRUE; + timestamp = plnetinfo->timestamp; + if (allocate_header) { + pbestnetheader = (dhd_pno_best_header_t *) + MALLOC(dhd->osh, BEST_HEADER_SIZE); + if (pbestnetheader == NULL) { + err = BCME_NOMEM; + if (pbestnet_entry) + MFREE(dhd->osh, pbestnet_entry, + BESTNET_ENTRY_SIZE); + DHD_ERROR(("failed to allocate dhd_pno_bestnet_entry\n")); + goto exit; + } + /* increase total cnt of bestnet header */ + pscan_results->cnt_header++; + /* need to record the reason to call dhd_pno_get_for_bach */ + if (reason) + pbestnetheader->reason = (ENABLE << reason); + memset(pbestnetheader, 0, BEST_HEADER_SIZE); + /* initialize the head of linked list */ + INIT_LIST_HEAD(&(pbestnetheader->entry_list)); + /* link the pbestnet heaer into existed list */ + if (pscan_results->bestnetheader == NULL) + /* In case of header */ + pscan_results->bestnetheader = pbestnetheader; + else { + dhd_pno_best_header_t *head = pscan_results->bestnetheader; + pscan_results->bestnetheader = pbestnetheader; + pbestnetheader->next = head; + } + } + /* fills the best network info */ + pbestnet_entry->channel = plnetinfo->pfnsubnet.channel; + pbestnet_entry->RSSI = plnetinfo->RSSI; + if (plnetinfo->flags & PFN_PARTIAL_SCAN_MASK) { + /* if RSSI is positive value, we assume that + * this scan is aborted by other scan + */ + DHD_PNO(("This scan is aborted\n")); + pbestnetheader->reason = (ENABLE << PNO_STATUS_ABORT); + } + pbestnet_entry->rtt0 = plnetinfo->rtt0; + pbestnet_entry->rtt1 = plnetinfo->rtt1; + pbestnet_entry->timestamp = plnetinfo->timestamp; + pbestnet_entry->SSID_len = plnetinfo->pfnsubnet.SSID_len; + memcpy(pbestnet_entry->SSID, plnetinfo->pfnsubnet.SSID, + pbestnet_entry->SSID_len); + memcpy(&pbestnet_entry->BSSID, &plnetinfo->pfnsubnet.BSSID, ETHER_ADDR_LEN); + /* add the element into list */ + list_add_tail(&pbestnet_entry->list, &pbestnetheader->entry_list); + /* increase best entry count */ + pbestnetheader->tot_cnt++; + pbestnetheader->tot_size += BESTNET_ENTRY_SIZE; + DHD_PNO(("Header %d\n", pscan_results->cnt_header - 1)); + DHD_PNO(("\tSSID : ")); + for (j = 0; j < plnetinfo->pfnsubnet.SSID_len; j++) + DHD_PNO(("%c", plnetinfo->pfnsubnet.SSID[j])); + DHD_PNO(("\n")); + DHD_PNO(("\tBSSID: %02x:%02x:%02x:%02x:%02x:%02x\n", + plnetinfo->pfnsubnet.BSSID.octet[0], + plnetinfo->pfnsubnet.BSSID.octet[1], + plnetinfo->pfnsubnet.BSSID.octet[2], + plnetinfo->pfnsubnet.BSSID.octet[3], + plnetinfo->pfnsubnet.BSSID.octet[4], + plnetinfo->pfnsubnet.BSSID.octet[5])); + DHD_PNO(("\tchannel: %d, RSSI: %d, timestamp: %d ms\n", + plnetinfo->pfnsubnet.channel, + plnetinfo->RSSI, plnetinfo->timestamp)); + DHD_PNO(("\tRTT0 : %d, RTT1: %d\n", plnetinfo->rtt0, plnetinfo->rtt1)); + plnetinfo++; + } + } + if (pscan_results->cnt_header == 0) { + /* In case that we didn't get any data from the firmware + * Remove the current scan_result list from get_bach.scan_results_list. + */ + DHD_PNO(("NO BATCH DATA from Firmware, Delete current SCAN RESULT LIST\n")); + list_del(&pscan_results->list); + MFREE(dhd->osh, pscan_results, SCAN_RESULTS_SIZE); + _params->params_batch.get_batch.top_node_cnt--; + } + /* increase total scan count using current scan count */ + _params->params_batch.get_batch.tot_scan_cnt += pscan_results->cnt_header; + + if (buf && bufsize) { + /* This is a first try to get batching results */ + if (!list_empty(&_params->params_batch.get_batch.scan_results_list)) { + /* move the scan_results_list to expired_scan_results_lists */ + list_for_each_entry_safe(siter, snext, + &_params->params_batch.get_batch.scan_results_list, list) { + list_move_tail(&siter->list, + &_params->params_batch.get_batch.expired_scan_results_list); + } + /* reset gloval values after moving to expired list */ + _params->params_batch.get_batch.top_node_cnt = 0; + _params->params_batch.get_batch.expired_tot_scan_cnt = + _params->params_batch.get_batch.tot_scan_cnt; + _params->params_batch.get_batch.tot_scan_cnt = 0; + } +convert_format: + err = _dhd_pno_convert_format(dhd, &_params->params_batch, buf, bufsize); + if (err < 0) { + DHD_ERROR(("failed to convert the data into upper layer format\n")); + goto exit; + } + } +exit: + if (plbestnet) + MFREE(dhd->osh, plbestnet, PNO_BESTNET_LEN); + if (_params) { + _params->params_batch.get_batch.buf = NULL; + _params->params_batch.get_batch.bufsize = 0; + _params->params_batch.get_batch.bytes_written = err; + } + mutex_unlock(&_pno_state->pno_mutex); + if (waitqueue_active(&_pno_state->get_batch_done.wait)) + complete(&_pno_state->get_batch_done); + return err; +} +static void +_dhd_pno_get_batch_handler(struct work_struct *work) +{ + dhd_pno_status_info_t *_pno_state; + dhd_pub_t *dhd; + struct dhd_pno_batch_params *params_batch; + DHD_PNO(("%s enter\n", __FUNCTION__)); + _pno_state = container_of(work, struct dhd_pno_status_info, work); + dhd = _pno_state->dhd; + if (dhd == NULL) { + DHD_ERROR(("%s : dhd is NULL\n", __FUNCTION__)); + return; + } + params_batch = &_pno_state->pno_params_arr[INDEX_OF_BATCH_PARAMS].params_batch; + _dhd_pno_get_for_batch(dhd, params_batch->get_batch.buf, + params_batch->get_batch.bufsize, params_batch->get_batch.reason); + +} + +int +dhd_pno_get_for_batch(dhd_pub_t *dhd, char *buf, int bufsize, int reason) +{ + int err = BCME_OK; + char *pbuf = buf; + dhd_pno_status_info_t *_pno_state; + struct dhd_pno_batch_params *params_batch; + NULL_CHECK(dhd, "dhd is NULL", err); + NULL_CHECK(dhd->pno_state, "pno_state is NULL", err); + if (!dhd_support_sta_mode(dhd)) { + err = BCME_BADOPTION; + goto exit; + } + DHD_PNO(("%s enter\n", __FUNCTION__)); + _pno_state = PNO_GET_PNOSTATE(dhd); + + if (!WLS_SUPPORTED(_pno_state)) { + DHD_ERROR(("%s : wifi location service is not supported\n", __FUNCTION__)); + err = BCME_UNSUPPORTED; + goto exit; + } + params_batch = &_pno_state->pno_params_arr[INDEX_OF_BATCH_PARAMS].params_batch; + if (!(_pno_state->pno_mode & DHD_PNO_BATCH_MODE)) { + DHD_ERROR(("%s: Batching SCAN mode is not enabled\n", __FUNCTION__)); + memset(pbuf, 0, bufsize); + pbuf += sprintf(pbuf, "scancount=%d\n", 0); + sprintf(pbuf, "%s", RESULTS_END_MARKER); + err = strlen(buf); + goto exit; + } + params_batch->get_batch.buf = buf; + params_batch->get_batch.bufsize = bufsize; + params_batch->get_batch.reason = reason; + params_batch->get_batch.bytes_written = 0; + schedule_work(&_pno_state->work); + wait_for_completion(&_pno_state->get_batch_done); + err = params_batch->get_batch.bytes_written; +exit: + return err; +} + +int +dhd_pno_stop_for_batch(dhd_pub_t *dhd) +{ + int err = BCME_OK; + int mode = 0; + int i = 0; + dhd_pno_status_info_t *_pno_state; + dhd_pno_params_t *_params; + wl_pfn_bssid_t *p_pfn_bssid; + wlc_ssid_t *p_ssid_list = NULL; + NULL_CHECK(dhd, "dhd is NULL", err); + NULL_CHECK(dhd->pno_state, "pno_state is NULL", err); + _pno_state = PNO_GET_PNOSTATE(dhd); + DHD_PNO(("%s enter\n", __FUNCTION__)); + if (!dhd_support_sta_mode(dhd)) { + err = BCME_BADOPTION; + goto exit; + } + if (!WLS_SUPPORTED(_pno_state)) { + DHD_ERROR(("%s : wifi location service is not supported\n", + __FUNCTION__)); + err = BCME_UNSUPPORTED; + goto exit; + } + if (!(_pno_state->pno_mode & DHD_PNO_BATCH_MODE)) { + DHD_ERROR(("%s : PNO BATCH MODE is not enabled\n", __FUNCTION__)); + goto exit; + } + _pno_state->pno_mode &= ~DHD_PNO_BATCH_MODE; + if (_pno_state->pno_mode & (DHD_PNO_LEGACY_MODE | DHD_PNO_HOTLIST_MODE)) { + mode = _pno_state->pno_mode; + dhd_pno_clean(dhd); + _pno_state->pno_mode = mode; + /* restart Legacy PNO if the Legacy PNO is on */ + if (_pno_state->pno_mode & DHD_PNO_LEGACY_MODE) { + struct dhd_pno_legacy_params *_params_legacy; + struct dhd_pno_ssid *iter, *next; + _params_legacy = + &(_pno_state->pno_params_arr[INDEX_OF_LEGACY_PARAMS].params_legacy); + p_ssid_list = kzalloc(sizeof(wlc_ssid_t) * + _params_legacy->nssid, GFP_KERNEL); + if (p_ssid_list == NULL) { + DHD_ERROR(("%s : failed to allocate wlc_ssid_t array (count: %d)", + __FUNCTION__, _params_legacy->nssid)); + err = BCME_ERROR; + _pno_state->pno_mode &= ~DHD_PNO_LEGACY_MODE; + goto exit; + } + i = 0; + /* convert dhd_pno_ssid to dhd_pno_ssid */ + list_for_each_entry_safe(iter, next, &_params_legacy->ssid_list, list) { + p_ssid_list[i].SSID_len = iter->SSID_len; + memcpy(p_ssid_list[i].SSID, iter->SSID, p_ssid_list[i].SSID_len); + i++; + } + err = dhd_pno_set_for_ssid(dhd, p_ssid_list, _params_legacy->nssid, + _params_legacy->scan_fr, _params_legacy->pno_repeat, + _params_legacy->pno_freq_expo_max, _params_legacy->chan_list, + _params_legacy->nchan); + if (err < 0) { + _pno_state->pno_mode &= ~DHD_PNO_LEGACY_MODE; + DHD_ERROR(("%s : failed to restart legacy PNO scan(err: %d)\n", + __FUNCTION__, err)); + goto exit; + } + } else if (_pno_state->pno_mode & DHD_PNO_HOTLIST_MODE) { + struct dhd_pno_bssid *iter, *next; + _params = &(_pno_state->pno_params_arr[INDEX_OF_HOTLIST_PARAMS]); + p_pfn_bssid = kzalloc(sizeof(wl_pfn_bssid_t) * + _params->params_hotlist.nbssid, GFP_KERNEL); + if (p_pfn_bssid == NULL) { + DHD_ERROR(("%s : failed to allocate wl_pfn_bssid_t array" + " (count: %d)", + __FUNCTION__, _params->params_hotlist.nbssid)); + err = BCME_ERROR; + _pno_state->pno_mode &= ~DHD_PNO_HOTLIST_MODE; + goto exit; + } + i = 0; + /* convert dhd_pno_bssid to wl_pfn_bssid */ + list_for_each_entry_safe(iter, next, + &_params->params_hotlist.bssid_list, list) { + memcpy(&p_pfn_bssid[i].macaddr, &iter->macaddr, ETHER_ADDR_LEN); + p_pfn_bssid[i].flags = iter->flags; + i++; + } + err = dhd_pno_set_for_hotlist(dhd, p_pfn_bssid, &_params->params_hotlist); + if (err < 0) { + _pno_state->pno_mode &= ~DHD_PNO_HOTLIST_MODE; + DHD_ERROR(("%s : failed to restart hotlist scan(err: %d)\n", + __FUNCTION__, err)); + goto exit; + } + } + } else { + err = dhd_pno_clean(dhd); + if (err < 0) { + DHD_ERROR(("%s : failed to call dhd_pno_clean (err: %d)\n", + __FUNCTION__, err)); + goto exit; + } + } +exit: + _params = &_pno_state->pno_params_arr[INDEX_OF_BATCH_PARAMS]; + _dhd_pno_reinitialize_prof(dhd, _params, DHD_PNO_BATCH_MODE); + if (p_ssid_list) + kfree(p_ssid_list); + return err; +} + +int +dhd_pno_set_for_hotlist(dhd_pub_t *dhd, wl_pfn_bssid_t *p_pfn_bssid, + struct dhd_pno_hotlist_params *hotlist_params) +{ + int err = BCME_OK; + int i; + uint16 _chan_list[WL_NUMCHANNELS]; + int rem_nchan = 0; + int tot_nchan = 0; + int mode = 0; + dhd_pno_params_t *_params; + dhd_pno_params_t *_params2; + struct dhd_pno_bssid *_pno_bssid; + dhd_pno_status_info_t *_pno_state; + NULL_CHECK(dhd, "dhd is NULL", err); + NULL_CHECK(dhd->pno_state, "pno_state is NULL", err); + NULL_CHECK(hotlist_params, "hotlist_params is NULL", err); + NULL_CHECK(p_pfn_bssid, "p_pfn_bssid is NULL", err); + _pno_state = PNO_GET_PNOSTATE(dhd); + DHD_PNO(("%s enter\n", __FUNCTION__)); + + if (!dhd_support_sta_mode(dhd)) { + err = BCME_BADOPTION; + goto exit; + } + if (!WLS_SUPPORTED(_pno_state)) { + DHD_ERROR(("%s : wifi location service is not supported\n", __FUNCTION__)); + err = BCME_UNSUPPORTED; + goto exit; + } + _params = &_pno_state->pno_params_arr[INDEX_OF_HOTLIST_PARAMS]; + if (!(_pno_state->pno_mode & DHD_PNO_HOTLIST_MODE)) { + _pno_state->pno_mode |= DHD_PNO_HOTLIST_MODE; + err = _dhd_pno_reinitialize_prof(dhd, _params, DHD_PNO_HOTLIST_MODE); + if (err < 0) { + DHD_ERROR(("%s : failed to call _dhd_pno_reinitialize_prof\n", + __FUNCTION__)); + goto exit; + } + } + _params->params_batch.nchan = hotlist_params->nchan; + _params->params_batch.scan_fr = hotlist_params->scan_fr; + if (hotlist_params->nchan) + memcpy(_params->params_hotlist.chan_list, hotlist_params->chan_list, + sizeof(_params->params_hotlist.chan_list)); + memset(_chan_list, 0, sizeof(_chan_list)); + + rem_nchan = ARRAYSIZE(hotlist_params->chan_list) - hotlist_params->nchan; + if (hotlist_params->band == WLC_BAND_2G || hotlist_params->band == WLC_BAND_5G) { + /* get a valid channel list based on band B or A */ + err = _dhd_pno_get_channels(dhd, + &_params->params_hotlist.chan_list[hotlist_params->nchan], + &rem_nchan, hotlist_params->band, FALSE); + if (err < 0) { + DHD_ERROR(("%s: failed to get valid channel list(band : %d)\n", + __FUNCTION__, hotlist_params->band)); + goto exit; + } + /* now we need to update nchan because rem_chan has valid channel count */ + _params->params_hotlist.nchan += rem_nchan; + /* need to sort channel list */ + sort(_params->params_hotlist.chan_list, _params->params_hotlist.nchan, + sizeof(_params->params_hotlist.chan_list[0]), _dhd_pno_cmpfunc, NULL); + } +#ifdef PNO_DEBUG +{ + int i; + DHD_PNO(("Channel list : ")); + for (i = 0; i < _params->params_batch.nchan; i++) { + DHD_PNO(("%d ", _params->params_batch.chan_list[i])); + } + DHD_PNO(("\n")); +} +#endif + if (_params->params_hotlist.nchan) { + /* copy the channel list into local array */ + memcpy(_chan_list, _params->params_hotlist.chan_list, + sizeof(_chan_list)); + tot_nchan = _params->params_hotlist.nchan; + } + if (_pno_state->pno_mode & DHD_PNO_LEGACY_MODE) { + DHD_PNO(("PNO SSID is on progress in firmware\n")); + /* store current pno_mode before disabling pno */ + mode = _pno_state->pno_mode; + err = _dhd_pno_enable(dhd, PNO_OFF); + if (err < 0) { + DHD_ERROR(("%s : failed to disable PNO\n", __FUNCTION__)); + goto exit; + } + /* restore the previous mode */ + _pno_state->pno_mode = mode; + /* Use the superset for channelist between two mode */ + _params2 = &(_pno_state->pno_params_arr[INDEX_OF_LEGACY_PARAMS]); + if (_params2->params_legacy.nchan > 0 && + _params->params_hotlist.nchan > 0) { + err = _dhd_pno_chan_merge(_chan_list, &tot_nchan, + &_params2->params_legacy.chan_list[0], + _params2->params_legacy.nchan, + &_params->params_hotlist.chan_list[0], + _params->params_hotlist.nchan); + if (err < 0) { + DHD_ERROR(("%s : failed to merge channel list" + "between legacy and hotlist\n", + __FUNCTION__)); + goto exit; + } + } + + } + + INIT_LIST_HEAD(&(_params->params_hotlist.bssid_list)); + + err = _dhd_pno_add_bssid(dhd, p_pfn_bssid, hotlist_params->nbssid); + if (err < 0) { + DHD_ERROR(("%s : failed to call _dhd_pno_add_bssid(err :%d)\n", + __FUNCTION__, err)); + goto exit; + } + if ((err = _dhd_pno_set(dhd, _params, DHD_PNO_HOTLIST_MODE)) < 0) { + DHD_ERROR(("%s : failed to set call pno_set (err %d) in firmware\n", + __FUNCTION__, err)); + goto exit; + } + if (tot_nchan > 0) { + if ((err = _dhd_pno_cfg(dhd, _chan_list, tot_nchan)) < 0) { + DHD_ERROR(("%s : failed to set call pno_cfg (err %d) in firmware\n", + __FUNCTION__, err)); + goto exit; + } + } + for (i = 0; i < hotlist_params->nbssid; i++) { + _pno_bssid = kzalloc(sizeof(struct dhd_pno_bssid), GFP_KERNEL); + NULL_CHECK(_pno_bssid, "_pfn_bssid is NULL", err); + memcpy(&_pno_bssid->macaddr, &p_pfn_bssid[i].macaddr, ETHER_ADDR_LEN); + _pno_bssid->flags = p_pfn_bssid[i].flags; + list_add_tail(&_pno_bssid->list, &_params->params_hotlist.bssid_list); + } + _params->params_hotlist.nbssid = hotlist_params->nbssid; + if (_pno_state->pno_status == DHD_PNO_DISABLED) { + if ((err = _dhd_pno_enable(dhd, PNO_ON)) < 0) + DHD_ERROR(("%s : failed to enable PNO\n", __FUNCTION__)); + } +exit: + /* clear mode in case of error */ + if (err < 0) + _pno_state->pno_mode &= ~DHD_PNO_HOTLIST_MODE; + return err; +} + +int +dhd_pno_stop_for_hotlist(dhd_pub_t *dhd) +{ + int err = BCME_OK; + uint32 mode = 0; + dhd_pno_status_info_t *_pno_state; + dhd_pno_params_t *_params; + wlc_ssid_t *p_ssid_list; + NULL_CHECK(dhd, "dhd is NULL", err); + NULL_CHECK(dhd->pno_state, "pno_state is NULL", err); + _pno_state = PNO_GET_PNOSTATE(dhd); + + if (!WLS_SUPPORTED(_pno_state)) { + DHD_ERROR(("%s : wifi location service is not supported\n", + __FUNCTION__)); + err = BCME_UNSUPPORTED; + goto exit; + } + + if (!(_pno_state->pno_mode & DHD_PNO_HOTLIST_MODE)) { + DHD_ERROR(("%s : Hotlist MODE is not enabled\n", + __FUNCTION__)); + goto exit; + } + _pno_state->pno_mode &= ~DHD_PNO_BATCH_MODE; + + if (_pno_state->pno_mode & (DHD_PNO_LEGACY_MODE | DHD_PNO_BATCH_MODE)) { + /* retrieve the batching data from firmware into host */ + dhd_pno_get_for_batch(dhd, NULL, 0, PNO_STATUS_DISABLE); + /* save current pno_mode before calling dhd_pno_clean */ + mode = _pno_state->pno_mode; + err = dhd_pno_clean(dhd); + if (err < 0) { + DHD_ERROR(("%s : failed to call dhd_pno_clean (err: %d)\n", + __FUNCTION__, err)); + goto exit; + } + /* restore previos pno mode */ + _pno_state->pno_mode = mode; + if (_pno_state->pno_mode & DHD_PNO_LEGACY_MODE) { + /* restart Legacy PNO Scan */ + struct dhd_pno_legacy_params *_params_legacy; + struct dhd_pno_ssid *iter, *next; + _params_legacy = + &(_pno_state->pno_params_arr[INDEX_OF_LEGACY_PARAMS].params_legacy); + p_ssid_list = + kzalloc(sizeof(wlc_ssid_t) * _params_legacy->nssid, GFP_KERNEL); + if (p_ssid_list == NULL) { + DHD_ERROR(("%s : failed to allocate wlc_ssid_t array (count: %d)", + __FUNCTION__, _params_legacy->nssid)); + err = BCME_ERROR; + _pno_state->pno_mode &= ~DHD_PNO_LEGACY_MODE; + goto exit; + } + /* convert dhd_pno_ssid to dhd_pno_ssid */ + list_for_each_entry_safe(iter, next, &_params_legacy->ssid_list, list) { + p_ssid_list->SSID_len = iter->SSID_len; + memcpy(p_ssid_list->SSID, iter->SSID, p_ssid_list->SSID_len); + p_ssid_list++; + } + err = dhd_pno_set_for_ssid(dhd, p_ssid_list, _params_legacy->nssid, + _params_legacy->scan_fr, _params_legacy->pno_repeat, + _params_legacy->pno_freq_expo_max, _params_legacy->chan_list, + _params_legacy->nchan); + if (err < 0) { + _pno_state->pno_mode &= ~DHD_PNO_LEGACY_MODE; + DHD_ERROR(("%s : failed to restart legacy PNO scan(err: %d)\n", + __FUNCTION__, err)); + goto exit; + } + } else if (_pno_state->pno_mode & DHD_PNO_BATCH_MODE) { + /* restart Batching Scan */ + _params = &(_pno_state->pno_params_arr[INDEX_OF_BATCH_PARAMS]); + /* restart BATCH SCAN */ + err = dhd_pno_set_for_batch(dhd, &_params->params_batch); + if (err < 0) { + _pno_state->pno_mode &= ~DHD_PNO_BATCH_MODE; + DHD_ERROR(("%s : failed to restart batch scan(err: %d)\n", + __FUNCTION__, err)); + goto exit; + } + } + } else { + err = dhd_pno_clean(dhd); + if (err < 0) { + DHD_ERROR(("%s : failed to call dhd_pno_clean (err: %d)\n", + __FUNCTION__, err)); + goto exit; + } + } +exit: + return err; +} + +int +dhd_pno_event_handler(dhd_pub_t *dhd, wl_event_msg_t *event, void *event_data) +{ + int err = BCME_OK; + uint status, event_type, flags, datalen; + dhd_pno_status_info_t *_pno_state; + NULL_CHECK(dhd, "dhd is NULL", err); + NULL_CHECK(dhd->pno_state, "pno_state is NULL", err); + _pno_state = PNO_GET_PNOSTATE(dhd); + if (!WLS_SUPPORTED(_pno_state)) { + DHD_ERROR(("%s : wifi location service is not supported\n", __FUNCTION__)); + err = BCME_UNSUPPORTED; + goto exit; + } + event_type = ntoh32(event->event_type); + flags = ntoh16(event->flags); + status = ntoh32(event->status); + datalen = ntoh32(event->datalen); + DHD_PNO(("%s enter : event_type :%d\n", __FUNCTION__, event_type)); + switch (event_type) { + case WLC_E_PFN_BSSID_NET_FOUND: + case WLC_E_PFN_BSSID_NET_LOST: + /* TODO : need to implement event logic using generic netlink */ + break; + case WLC_E_PFN_BEST_BATCHING: + { + struct dhd_pno_batch_params *params_batch; + params_batch = &_pno_state->pno_params_arr[INDEX_OF_BATCH_PARAMS].params_batch; + if (!waitqueue_active(&_pno_state->get_batch_done.wait)) { + DHD_PNO(("%s : WLC_E_PFN_BEST_BATCHING\n", __FUNCTION__)); + params_batch->get_batch.buf = NULL; + params_batch->get_batch.bufsize = 0; + params_batch->get_batch.reason = PNO_STATUS_EVENT; + schedule_work(&_pno_state->work); + } else + DHD_PNO(("%s : WLC_E_PFN_BEST_BATCHING" + "will skip this event\n", __FUNCTION__)); + break; + } + default: + DHD_ERROR(("unknown event : %d\n", event_type)); + } +exit: + return err; +} + +int dhd_pno_init(dhd_pub_t *dhd) +{ + int err = BCME_OK; + dhd_pno_status_info_t *_pno_state; + NULL_CHECK(dhd, "dhd is NULL", err); + DHD_PNO(("%s enter\n", __FUNCTION__)); + UNUSED_PARAMETER(_dhd_pno_suspend); + if (dhd->pno_state) + goto exit; + dhd->pno_state = MALLOC(dhd->osh, sizeof(dhd_pno_status_info_t)); + NULL_CHECK(dhd->pno_state, "failed to create dhd_pno_state", err); + memset(dhd->pno_state, 0, sizeof(dhd_pno_status_info_t)); + /* need to check whether current firmware support batching and hotlist scan */ + _pno_state = PNO_GET_PNOSTATE(dhd); + _pno_state->wls_supported = TRUE; + _pno_state->dhd = dhd; + mutex_init(&_pno_state->pno_mutex); + INIT_WORK(&_pno_state->work, _dhd_pno_get_batch_handler); + init_completion(&_pno_state->get_batch_done); + err = dhd_iovar(dhd, 0, "pfnlbest", NULL, 0, 0); + if (err == BCME_UNSUPPORTED) { + _pno_state->wls_supported = FALSE; + DHD_INFO(("Current firmware doesn't support" + " Android Location Service\n")); + } +exit: + return err; +} +int dhd_pno_deinit(dhd_pub_t *dhd) +{ + int err = BCME_OK; + dhd_pno_status_info_t *_pno_state; + dhd_pno_params_t *_params; + NULL_CHECK(dhd, "dhd is NULL", err); + + DHD_PNO(("%s enter\n", __FUNCTION__)); + _pno_state = PNO_GET_PNOSTATE(dhd); + NULL_CHECK(_pno_state, "pno_state is NULL", err); + if (_pno_state->pno_mode & DHD_PNO_BATCH_MODE) { + _params = &_pno_state->pno_params_arr[INDEX_OF_BATCH_PARAMS]; + /* clear resource if the BATCH MODE is on */ + _dhd_pno_reinitialize_prof(dhd, _params, DHD_PNO_BATCH_MODE); + } + cancel_work_sync(&_pno_state->work); + MFREE(dhd->osh, _pno_state, sizeof(dhd_pno_status_info_t)); + dhd->pno_state = NULL; + return err; +} diff --git a/drivers/net/wireless/bcmdhd/dhd_pno.h b/drivers/net/wireless/bcmdhd/dhd_pno.h new file mode 100644 index 00000000000..769cdb99f1e --- /dev/null +++ b/drivers/net/wireless/bcmdhd/dhd_pno.h @@ -0,0 +1,250 @@ +/* + * Header file of Broadcom Dongle Host Driver (DHD) + * Prefered Network Offload code and Wi-Fi Location Service(WLS) code. + * Copyright (C) 1999-2013, Broadcom Corporation + * + * Unless you and Broadcom execute a separate written software license + * agreement governing use of this software, this software is licensed to you + * under the terms of the GNU General Public License version 2 (the "GPL"), + * available at http://www.broadcom.com/licenses/GPLv2.php, with the + * following added to such license: + * + * As a special exception, the copyright holders of this software give you + * permission to link this software with independent modules, and to copy and + * distribute the resulting executable under terms of your choice, provided that + * you also meet, for each linked independent module, the terms and conditions of + * the license of that module. An independent module is a module which is not + * derived from this software. The special exception does not apply to any + * modifications of the software. + * + * Notwithstanding the above, under no circumstances may you combine this + * software in any way with any other Broadcom software provided under a license + * other than the GPL, without Broadcom's express prior written consent. + * + * $Id: dhd_pno.h 423669 2013-09-12 23:01:55Z $ + */ + +#ifndef __DHD_PNO_H__ +#define __DHD_PNO_H__ + +#define PNO_TLV_PREFIX 'S' +#define PNO_TLV_VERSION '1' +#define PNO_TLV_SUBTYPE_LEGACY_PNO '2' +#define PNO_TLV_RESERVED '0' + +#define PNO_BATCHING_SET "SET" +#define PNO_BATCHING_GET "GET" +#define PNO_BATCHING_STOP "STOP" + +#define PNO_PARAMS_DELIMETER " " +#define PNO_PARAM_CHANNEL_DELIMETER "," +#define PNO_PARAM_VALUE_DELLIMETER '=' +#define PNO_PARAM_SCANFREQ "SCANFREQ" +#define PNO_PARAM_BESTN "BESTN" +#define PNO_PARAM_MSCAN "MSCAN" +#define PNO_PARAM_CHANNEL "CHANNEL" +#define PNO_PARAM_RTT "RTT" + +#define PNO_TLV_TYPE_SSID_IE 'S' +#define PNO_TLV_TYPE_TIME 'T' +#define PNO_TLV_FREQ_REPEAT 'R' +#define PNO_TLV_FREQ_EXPO_MAX 'M' + +#define MAXNUM_SSID_PER_ADD 16 +#define MAXNUM_PNO_PARAMS 2 +#define PNO_TLV_COMMON_LENGTH 1 +#define DEFAULT_BATCH_MSCAN 16 + +#define RESULTS_END_MARKER "----\n" +#define SCAN_END_MARKER "####\n" +#define AP_END_MARKER "====\n" + +enum scan_status { + /* SCAN ABORT by other scan */ + PNO_STATUS_ABORT, + /* RTT is presence or not */ + PNO_STATUS_RTT_PRESENCE, + /* Disable PNO by Driver */ + PNO_STATUS_DISABLE, + /* NORMAL BATCHING GET */ + PNO_STATUS_NORMAL, + /* WLC_E_PFN_BEST_BATCHING */ + PNO_STATUS_EVENT, + PNO_STATUS_MAX +}; +#define PNO_STATUS_ABORT_MASK 0x0001 +#define PNO_STATUS_RTT_MASK 0x0002 +#define PNO_STATUS_DISABLE_MASK 0x0004 +#define PNO_STATUS_OOM_MASK 0x0010 + +enum index_mode { + INDEX_OF_LEGACY_PARAMS, + INDEX_OF_BATCH_PARAMS, + INDEX_OF_HOTLIST_PARAMS, + INDEX_MODE_MAX +}; +enum dhd_pno_status { + DHD_PNO_DISABLED, + DHD_PNO_ENABLED, + DHD_PNO_SUSPEND +}; +typedef struct cmd_tlv { + char prefix; + char version; + char subtype; + char reserved; +} cmd_tlv_t; +typedef enum dhd_pno_mode { + /* Wi-Fi Legacy PNO Mode */ + DHD_PNO_NONE_MODE = 0, + DHD_PNO_LEGACY_MODE = (1 << (0)), + /* Wi-Fi Android BATCH SCAN Mode */ + DHD_PNO_BATCH_MODE = (1 << (1)), + /* Wi-Fi Android Hotlist SCAN Mode */ + DHD_PNO_HOTLIST_MODE = (1 << (2)) +} dhd_pno_mode_t; +struct dhd_pno_ssid { + uint32 SSID_len; + uchar SSID[DOT11_MAX_SSID_LEN]; + struct list_head list; +}; +struct dhd_pno_bssid { + struct ether_addr macaddr; + /* Bit4: suppress_lost, Bit3: suppress_found */ + uint16 flags; + struct list_head list; +}; +typedef struct dhd_pno_bestnet_entry { + struct ether_addr BSSID; + uint8 SSID_len; + uint8 SSID[DOT11_MAX_SSID_LEN]; + int8 RSSI; + uint8 channel; + uint32 timestamp; + uint16 rtt0; /* distance_cm based on RTT */ + uint16 rtt1; /* distance_cm based on sample standard deviation */ + unsigned long recorded_time; + struct list_head list; +} dhd_pno_bestnet_entry_t; +#define BESTNET_ENTRY_SIZE (sizeof(dhd_pno_bestnet_entry_t)) + +typedef struct dhd_pno_bestnet_header { + struct dhd_pno_bestnet_header *next; + uint8 reason; + uint32 tot_cnt; + uint32 tot_size; + struct list_head entry_list; +} dhd_pno_best_header_t; +#define BEST_HEADER_SIZE (sizeof(dhd_pno_best_header_t)) + +typedef struct dhd_pno_scan_results { + dhd_pno_best_header_t *bestnetheader; + uint8 cnt_header; + struct list_head list; +} dhd_pno_scan_results_t; +#define SCAN_RESULTS_SIZE (sizeof(dhd_pno_scan_results_t)) + +struct dhd_pno_get_batch_info { + /* info related to get batch */ + char *buf; + bool batch_started; + uint32 tot_scan_cnt; + uint32 expired_tot_scan_cnt; + uint32 top_node_cnt; + uint32 bufsize; + uint32 bytes_written; + int reason; + struct list_head scan_results_list; + struct list_head expired_scan_results_list; +}; +struct dhd_pno_legacy_params { + uint16 scan_fr; + uint16 chan_list[WL_NUMCHANNELS]; + uint16 nchan; + int pno_repeat; + int pno_freq_expo_max; + int nssid; + struct list_head ssid_list; +}; +struct dhd_pno_batch_params { + int32 scan_fr; + uint8 bestn; + uint8 mscan; + uint8 band; + uint16 chan_list[WL_NUMCHANNELS]; + uint16 nchan; + uint16 rtt; + struct dhd_pno_get_batch_info get_batch; +}; +struct dhd_pno_hotlist_params { + uint8 band; + int32 scan_fr; + uint16 chan_list[WL_NUMCHANNELS]; + uint16 nchan; + uint16 nbssid; + struct list_head bssid_list; +}; +typedef union dhd_pno_params { + struct dhd_pno_legacy_params params_legacy; + struct dhd_pno_batch_params params_batch; + struct dhd_pno_hotlist_params params_hotlist; +} dhd_pno_params_t; +typedef struct dhd_pno_status_info { + dhd_pub_t *dhd; + struct work_struct work; + struct mutex pno_mutex; + struct completion get_batch_done; + bool wls_supported; /* wifi location service supported or not */ + enum dhd_pno_status pno_status; + enum dhd_pno_mode pno_mode; + dhd_pno_params_t pno_params_arr[INDEX_MODE_MAX]; + struct list_head head_list; +} dhd_pno_status_info_t; + +/* wrapper functions */ +extern int +dhd_dev_pno_enable(struct net_device *dev, int enable); + +extern int +dhd_dev_pno_stop_for_ssid(struct net_device *dev); + +extern int +dhd_dev_pno_set_for_ssid(struct net_device *dev, wlc_ssid_t* ssids_local, int nssid, + uint16 scan_fr, int pno_repeat, int pno_freq_expo_max, uint16 *channel_list, int nchan); + +extern int +dhd_dev_pno_set_for_batch(struct net_device *dev, + struct dhd_pno_batch_params *batch_params); + +extern int +dhd_dev_pno_get_for_batch(struct net_device *dev, char *buf, int bufsize); + +extern int +dhd_dev_pno_stop_for_batch(struct net_device *dev); + +extern int +dhd_dev_pno_set_for_hotlist(struct net_device *dev, wl_pfn_bssid_t *p_pfn_bssid, + struct dhd_pno_hotlist_params *hotlist_params); + +/* dhd pno fuctions */ +extern int dhd_pno_stop_for_ssid(dhd_pub_t *dhd); +extern int dhd_pno_enable(dhd_pub_t *dhd, int enable); +extern int dhd_pno_set_for_ssid(dhd_pub_t *dhd, wlc_ssid_t* ssid_list, int nssid, + uint16 scan_fr, int pno_repeat, int pno_freq_expo_max, uint16 *channel_list, int nchan); + +extern int dhd_pno_set_for_batch(dhd_pub_t *dhd, struct dhd_pno_batch_params *batch_params); + +extern int dhd_pno_get_for_batch(dhd_pub_t *dhd, char *buf, int bufsize, int reason); + + +extern int dhd_pno_stop_for_batch(dhd_pub_t *dhd); + +extern int dhd_pno_set_for_hotlist(dhd_pub_t *dhd, wl_pfn_bssid_t *p_pfn_bssid, + struct dhd_pno_hotlist_params *hotlist_params); + +extern int dhd_pno_stop_for_hotlist(dhd_pub_t *dhd); + +extern int dhd_pno_event_handler(dhd_pub_t *dhd, wl_event_msg_t *event, void *event_data); +extern int dhd_pno_init(dhd_pub_t *dhd); +extern int dhd_pno_deinit(dhd_pub_t *dhd); +#endif /* __DHD_PNO_H__ */ diff --git a/drivers/net/wireless/bcmdhd/dhd_proto.h b/drivers/net/wireless/bcmdhd/dhd_proto.h index 21dfe238008..9fb20528eb3 100644 --- a/drivers/net/wireless/bcmdhd/dhd_proto.h +++ b/drivers/net/wireless/bcmdhd/dhd_proto.h @@ -4,7 +4,7 @@ * Provides type definitions and function prototypes used to link the * DHD OS, bus, and protocol modules. * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -24,7 +24,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: dhd_proto.h 364579 2012-10-24 17:56:37Z $ + * $Id: dhd_proto.h 390836 2013-03-13 23:43:53Z $ */ #ifndef _dhd_proto_h_ @@ -83,13 +83,6 @@ extern int dhd_ioctl(dhd_pub_t * dhd_pub, dhd_ioctl_t *ioc, void * buf, uint buf extern int dhd_preinit_ioctls(dhd_pub_t *dhd); -#ifdef PROP_TXSTATUS -extern int dhd_wlfc_commit_packets(void* state, f_commitpkt_t fcommit, - void* commit_ctx, void *pktbuf); -extern void dhd_wlfc_cleanup(dhd_pub_t *dhd, ifpkt_cb_t fn, int arg); -extern bool ifpkt_fn(void* p, int ifid); -#endif /* PROP_TXSTATUS */ - extern int dhd_process_pkt_reorder_info(dhd_pub_t *dhd, uchar *reorder_info_buf, uint reorder_info_len, void **pkt, uint32 *free_buf_count); diff --git a/drivers/net/wireless/bcmdhd/dhd_sdio.c b/drivers/net/wireless/bcmdhd/dhd_sdio.c index e2f5a331a57..6860ece0fcd 100644 --- a/drivers/net/wireless/bcmdhd/dhd_sdio.c +++ b/drivers/net/wireless/bcmdhd/dhd_sdio.c @@ -1,7 +1,7 @@ /* * DHD Bus Module for SDIO * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -21,7 +21,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: dhd_sdio.c 424018 2013-09-15 13:23:56Z $ + * $Id: dhd_sdio.c 445342 2013-12-26 06:03:12Z $ */ #include @@ -69,6 +69,11 @@ #include #include +bool dhd_mp_halting(dhd_pub_t *dhdp); +extern void bcmsdh_waitfor_iodrain(void *sdh); +extern void bcmsdh_reject_ioreqs(void *sdh, bool reject); +extern bool bcmsdh_fatal_error(void *sdh); + #ifndef DHDSDIO_MEM_DUMP_FNAME #define DHDSDIO_MEM_DUMP_FNAME "mem_dump" #endif @@ -165,9 +170,11 @@ extern int dhd_os_wlfc_unblock(dhd_pub_t *pub); #endif /* DHDTCPACK_SUPPRESS */ #endif /* PROP_TXSTATUS */ +#if defined(MULTIPLE_SUPPLICANT) #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25)) DEFINE_MUTEX(_dhd_sdio_mutex_lock_); #endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25)) */ +#endif #ifdef DHD_DEBUG /* Device console log buffer state */ @@ -200,6 +207,7 @@ typedef struct dhd_console { #define GPIO_DEV_SRSTATE_TIMEOUT 320000 /* 320ms */ #define GPIO_DEV_WAKEUP 17 /* Host gpio17 mapped to device gpio1 wakeup */ #define CC_CHIPCTRL2_GPIO1_WAKEUP (1 << 0) +#define CC_CHIPCTRL3_SR_ENG_ENABLE (1 << 2) #define OVERFLOW_BLKSZ512_WM 48 #define OVERFLOW_BLKSZ512_MES 80 @@ -398,6 +406,10 @@ static int tx_packets[NUMPRIO]; const uint dhd_deferred_tx = 1; extern uint dhd_watchdog_ms; +#ifdef BCMSPI_ANDROID +extern uint *dhd_spi_lockcount; +#endif /* BCMSPI_ANDROID */ + extern void dhd_os_wd_timer(void *bus, uint wdtick); /* Tx/Rx bounds */ @@ -406,14 +418,15 @@ uint dhd_rxbound; uint dhd_txminmax = DHD_TXMINMAX; /* override the RAM size if possible */ -#define DONGLE_MIN_MEMSIZE (128 *1024) -int dhd_dongle_memsize; +#define DONGLE_MIN_RAMSIZE (128 *1024) +int dhd_dongle_ramsize; + +uint dhd_doflow = TRUE; +uint dhd_dpcpoll = FALSE; + +module_param(dhd_doflow, uint, 0644); +module_param(dhd_dpcpoll, uint, 0644); -#ifndef REPEAT_READFRAME -static bool dhd_doflow; -#else -extern bool dhd_doflow; -#endif /* REPEAT_READFRAME */ static bool dhd_alignctl; static bool sd1idle; @@ -608,7 +621,7 @@ static bool dhdsdio_probe_init(dhd_bus_t *bus, osl_t *osh, void *sdh); static void dhdsdio_release_dongle(dhd_bus_t *bus, osl_t *osh, bool dongle_isolation, bool reset_flag); -static void dhd_dongle_setmemsize(struct dhd_bus *bus, int mem_size); +static void dhd_dongle_setramsize(struct dhd_bus *bus, int mem_size); static int dhd_bcmsdh_recv_buf(dhd_bus_t *bus, uint32 addr, uint fn, uint flags, uint8 *buf, uint nbytes, void *pkt, bcmsdh_cmplt_fn_t complete, void *handle); @@ -671,15 +684,15 @@ dhd_overflow_war(struct dhd_bus *bus) } static void -dhd_dongle_setmemsize(struct dhd_bus *bus, int mem_size) +dhd_dongle_setramsize(struct dhd_bus *bus, int mem_size) { - int32 min_size = DONGLE_MIN_MEMSIZE; - /* Restrict the memsize to user specified limit */ + int32 min_size = DONGLE_MIN_RAMSIZE; + /* Restrict the ramsize to user specified limit */ DHD_ERROR(("user: Restrict the dongle ram size to %d, min accepted %d\n", - dhd_dongle_memsize, min_size)); - if ((dhd_dongle_memsize > min_size) && - (dhd_dongle_memsize < (int32)bus->orig_ramsize)) - bus->ramsize = dhd_dongle_memsize; + dhd_dongle_ramsize, min_size)); + if ((dhd_dongle_ramsize > min_size) && + (dhd_dongle_ramsize < (int32)bus->orig_ramsize)) + bus->ramsize = dhd_dongle_ramsize; } static int @@ -753,17 +766,19 @@ dhdsdio_sr_cap(dhd_bus_t *bus) bool cap = FALSE; uint32 core_capext, addr, data; if (bus->sih->chip == BCM4324_CHIP_ID) { - addr = SI_ENUM_BASE + OFFSETOF(chipcregs_t, chipcontrol_addr); - data = SI_ENUM_BASE + OFFSETOF(chipcregs_t, chipcontrol_data); - bcmsdh_reg_write(bus->sdh, addr, 4, 3); - core_capext = bcmsdh_reg_read(bus->sdh, data, 4); + addr = SI_ENUM_BASE + OFFSETOF(chipcregs_t, chipcontrol_addr); + data = SI_ENUM_BASE + OFFSETOF(chipcregs_t, chipcontrol_data); + bcmsdh_reg_write(bus->sdh, addr, 4, 3); + core_capext = bcmsdh_reg_read(bus->sdh, data, 4); } else if (bus->sih->chip == BCM4330_CHIP_ID) { - core_capext = FALSE; - } else if (bus->sih->chip == BCM4335_CHIP_ID) { + core_capext = FALSE; + } else if ((bus->sih->chip == BCM4335_CHIP_ID) || + (bus->sih->chip == BCM4339_CHIP_ID) || + (bus->sih->chip == BCM4350_CHIP_ID)) { core_capext = TRUE; } else { - core_capext = bcmsdh_reg_read(bus->sdh, CORE_CAPEXT_ADDR, 4); - core_capext = (core_capext & CORE_CAPEXT_SR_SUPPORTED_MASK); + core_capext = bcmsdh_reg_read(bus->sdh, CORE_CAPEXT_ADDR, 4); + core_capext = (core_capext & CORE_CAPEXT_SR_SUPPORTED_MASK); } if (!(core_capext)) return FALSE; @@ -771,13 +786,19 @@ dhdsdio_sr_cap(dhd_bus_t *bus) if (bus->sih->chip == BCM4324_CHIP_ID) { /* FIX: Should change to query SR control register instead */ cap = TRUE; - } else if (bus->sih->chip == BCM4335_CHIP_ID) { + } else if ((bus->sih->chip == BCM4335_CHIP_ID) || + (bus->sih->chip == BCM4339_CHIP_ID)) { uint32 enabval = 0; addr = SI_ENUM_BASE + OFFSETOF(chipcregs_t, chipcontrol_addr); data = SI_ENUM_BASE + OFFSETOF(chipcregs_t, chipcontrol_data); bcmsdh_reg_write(bus->sdh, addr, 4, CC_PMUCC3); enabval = bcmsdh_reg_read(bus->sdh, data, 4); + if ((bus->sih->chip == BCM4350_CHIP_ID) || + 0) + enabval &= CC_CHIPCTRL3_SR_ENG_ENABLE; + + if (enabval) cap = TRUE; } else { @@ -793,7 +814,6 @@ dhdsdio_sr_cap(dhd_bus_t *bus) static int dhdsdio_srwar_init(dhd_bus_t *bus) { - bcmsdh_gpio_init(bus->sdh); #ifdef USE_OOB_GPIO1 @@ -864,6 +884,10 @@ dhdsdio_clk_kso_init(dhd_bus_t *bus) #define KSO_DBG(x) #define KSO_WAIT_US 50 +#define KSO_WAIT_MS 1 +#define KSO_SLEEP_RETRY_COUNT 20 +#define ERROR_BCME_NODEVICE_MAX 1 + #if defined(CUSTOMER_HW4) #define MAX_KSO_ATTEMPTS 64 #else @@ -899,7 +923,11 @@ dhdsdio_clk_kso_enab(dhd_bus_t *bus, bool on) break; KSO_DBG(("%s> KSO wr/rd retry:%d, ERR:%x \n", __FUNCTION__, try_cnt, err)); - OSL_DELAY(KSO_WAIT_US); + + if (((try_cnt + 1) % KSO_SLEEP_RETRY_COUNT) == 0) { + OSL_SLEEP(KSO_WAIT_MS); + } else + OSL_DELAY(KSO_WAIT_US); bcmsdh_cfg_write(bus->sdh, SDIO_FUNC_1, SBSDIO_FUNC1_SLEEPCSR, wr_val, &err); } while (try_cnt++ < MAX_KSO_ATTEMPTS); @@ -939,16 +967,7 @@ dhdsdio_clk_kso_iovar(dhd_bus_t *bus, bool on) dhdsdio_clkctl(bus, CLK_SDONLY, FALSE); } - /* Double-write to be safe in case transition of AOS */ - dhdsdio_clk_kso_enab(bus, TRUE); dhdsdio_clk_kso_enab(bus, TRUE); - OSL_DELAY(4000); - - /* Wait for device ready during transition to wake-up */ - SPINWAIT(((dhdsdio_sleepcsr_get(bus)) != - (SBSDIO_FUNC1_SLEEPCSR_KSO_MASK | - SBSDIO_FUNC1_SLEEPCSR_DEVON_MASK)), - (10000)); DHD_ERROR(("%s: sleepcsr: 0x%x\n", __FUNCTION__, dhdsdio_sleepcsr_get(bus))); @@ -1027,7 +1046,9 @@ dhdsdio_clk_devsleep_iovar(dhd_bus_t *bus, bool on) SBSDIO_FUNC1_CHIPCLKCSR, &err))); err = dhdsdio_clk_kso_enab(bus, FALSE); if (OOB_WAKEUP_ENAB(bus)) + { err = bcmsdh_gpioout(bus->sdh, GPIO_DEV_WAKEUP, FALSE); /* GPIO_1 is off */ + } } else { /* Exit Sleep */ /* Make sure we have SD bus access */ @@ -1046,8 +1067,9 @@ dhdsdio_clk_devsleep_iovar(dhd_bus_t *bus, bool on) } } if (OOB_WAKEUP_ENAB(bus)) + { err = bcmsdh_gpioout(bus->sdh, GPIO_DEV_WAKEUP, TRUE); /* GPIO_1 is on */ - + } do { err = dhdsdio_clk_kso_enab(bus, TRUE); if (err) @@ -1081,6 +1103,12 @@ dhdsdio_clk_devsleep_iovar(dhd_bus_t *bus, bool on) SBSDIO_FUNC1_CHIPCLKCSR, &err)) & SBSDIO_HT_AVAIL) != (SBSDIO_HT_AVAIL)), (10000)); + DHD_TRACE(("%s: SBSDIO_FUNC1_CHIPCLKCSR : 0x%x\n", __FUNCTION__, csr)); + if (!err && ((csr & SBSDIO_HT_AVAIL) != SBSDIO_HT_AVAIL)) { + DHD_ERROR(("%s:ERROR: device NOT Ready! 0x%x\n", + __FUNCTION__, csr)); + err = BCME_NODEVICE; + } } } @@ -1088,9 +1116,10 @@ dhdsdio_clk_devsleep_iovar(dhd_bus_t *bus, bool on) if (err == 0) bus->kso = on ? FALSE : TRUE; else { - DHD_ERROR(("%s: Sleep request failed: on:%d err:%d\n", __FUNCTION__, on, err)); + DHD_ERROR(("%s: Sleep request failed: kso:%d on:%d err:%d\n", + __FUNCTION__, bus->kso, on, err)); if (!on && retry > 2) - bus->kso = TRUE; + bus->kso = FALSE; } return err; @@ -1420,6 +1449,9 @@ dhdsdio_bussleep(dhd_bus_t *bus, bool sleep) (sleep ? "SLEEP" : "WAKE"), (bus->sleeping ? "SLEEP" : "WAKE"))); + if (bus->dhd->hang_was_sent) + return BCME_ERROR; + /* Done if we're already in the requested state */ if (sleep == bus->sleeping) return BCME_OK; @@ -1428,7 +1460,8 @@ dhdsdio_bussleep(dhd_bus_t *bus, bool sleep) if (sleep) { /* Don't sleep if something is pending */ #ifdef CUSTOMER_HW4 - if (bus->dpc_sched || bus->rxskip || pktq_len(&bus->txq) || bus->readframes) + if (bus->dpc_sched || bus->rxskip || pktq_len(&bus->txq) || bus->readframes || + bus->ctrl_frame_stat) #else if (bus->dpc_sched || bus->rxskip || pktq_len(&bus->txq)) #endif /* CUSTOMER_HW4 */ @@ -1542,11 +1575,13 @@ int dhdsdio_func_blocksize(dhd_pub_t *dhd, int function_num, int block_size) } #endif /* CUSTOMER_HW4 && USE_DYNAMIC_F2_BLKSIZE */ -#if defined(OOB_INTR_ONLY) +#if defined(OOB_INTR_ONLY) || defined(BCMSPI_ANDROID) void dhd_enable_oob_intr(struct dhd_bus *bus, bool enable) { -#if defined(HW_OOB) +#if defined(BCMSPI_ANDROID) + bcmsdh_intr_enable(bus->sdh); +#elif defined(HW_OOB) bcmsdh_enable_hw_oob_intr(bus->sdh, enable); #else sdpcmd_regs_t *regs = bus->regs; @@ -1571,8 +1606,7 @@ dhd_enable_oob_intr(struct dhd_bus *bus, bool enable) dhdsdio_clkctl(bus, CLK_SDONLY, FALSE); #endif /* !defined(HW_OOB) */ } -#endif /* defined(OOB_INTR_ONLY) */ - +#endif /* defined(OOB_INTR_ONLY) || defined(BCMSPI_ANDROID) */ #ifdef DHDTCPACK_SUPPRESS extern bool dhd_use_tcpack_suppress; @@ -1774,8 +1808,9 @@ dhd_tcpack_suppress(dhd_pub_t *dhdp, void *pkt) PKTLEN(dhdp->osh, prevpkt), tcp_ack_info->ip_tcp_ttllen)); #ifdef PROP_TXSTATUS - dhd_os_wlfc_unblock(dhdp); + dhd_os_wlfc_unblock(dhdp); #endif + } else { #ifdef TCPACK_TEST void *prevpkt = tcp_ack_info->p_tcpackinqueue; @@ -1808,8 +1843,6 @@ dhd_tcpack_suppress(dhd_pub_t *dhdp, void *pkt) return FALSE; } #endif /* DHDTCPACK_SUPPRESS */ - - /* Writes a HW/SW header into the packet and sends it. */ /* Assumes: (a) header space already there, (b) caller holds lock */ static int @@ -2023,67 +2056,67 @@ dhdsdio_txpkt(dhd_bus_t *bus, void *pkt, uint chan, bool free_pkt, bool queue_on } else #endif /* BCMSDIOH_TXGLOM */ { - act_len = len; - /* Software tag: channel, sequence number, data offset */ - swheader = ((chan << SDPCM_CHANNEL_SHIFT) & SDPCM_CHANNEL_MASK) | bus->tx_seq | - (((pad1 + SDPCM_HDRLEN) << SDPCM_DOFFSET_SHIFT) & SDPCM_DOFFSET_MASK); - htol32_ua_store(swheader, frame + SDPCM_FRAMETAG_LEN); - htol32_ua_store(0, frame + SDPCM_FRAMETAG_LEN + sizeof(swheader)); + act_len = len; + /* Software tag: channel, sequence number, data offset */ + swheader = ((chan << SDPCM_CHANNEL_SHIFT) & SDPCM_CHANNEL_MASK) | bus->tx_seq | + (((pad1 + SDPCM_HDRLEN) << SDPCM_DOFFSET_SHIFT) & SDPCM_DOFFSET_MASK); + htol32_ua_store(swheader, frame + SDPCM_FRAMETAG_LEN); + htol32_ua_store(0, frame + SDPCM_FRAMETAG_LEN + sizeof(swheader)); #ifdef DHD_DEBUG - if (PKTPRIO(pkt) < ARRAYSIZE(tx_packets)) { - tx_packets[PKTPRIO(pkt)]++; - } - if (DHD_BYTES_ON() && - (((DHD_CTL_ON() && (chan == SDPCM_CONTROL_CHANNEL)) || - (DHD_DATA_ON() && (chan != SDPCM_CONTROL_CHANNEL))))) { - prhex("Tx Frame", frame, len); - } else if (DHD_HDRS_ON()) { - prhex("TxHdr", frame, MIN(len, 16)); - } + if (PKTPRIO(pkt) < ARRAYSIZE(tx_packets)) { + tx_packets[PKTPRIO(pkt)]++; + } + if (DHD_BYTES_ON() && + (((DHD_CTL_ON() && (chan == SDPCM_CONTROL_CHANNEL)) || + (DHD_DATA_ON() && (chan != SDPCM_CONTROL_CHANNEL))))) { + prhex("Tx Frame", frame, len); + } else if (DHD_HDRS_ON()) { + prhex("TxHdr", frame, MIN(len, 16)); + } #endif #ifndef BCMSPI - /* Raise len to next SDIO block to eliminate tail command */ - if (bus->roundup && bus->blocksize && (len > bus->blocksize)) { - uint16 pad2 = bus->blocksize - (len % bus->blocksize); - if ((pad2 <= bus->roundup) && (pad2 < bus->blocksize)) + /* Raise len to next SDIO block to eliminate tail command */ + if (bus->roundup && bus->blocksize && (len > bus->blocksize)) { + uint16 pad2 = bus->blocksize - (len % bus->blocksize); + if ((pad2 <= bus->roundup) && (pad2 < bus->blocksize)) #ifdef NOTUSED - if (pad2 <= PKTTAILROOM(osh, pkt)) + if (pad2 <= PKTTAILROOM(osh, pkt)) #endif /* NOTUSED */ - len += pad2; - } else if (len % DHD_SDALIGN) { - len += DHD_SDALIGN - (len % DHD_SDALIGN); - } + len += pad2; + } else if (len % DHD_SDALIGN) { + len += DHD_SDALIGN - (len % DHD_SDALIGN); + } #endif /* BCMSPI */ - /* Some controllers have trouble with odd bytes -- round to even */ - if (forcealign && (len & (ALIGNMENT - 1))) { + /* Some controllers have trouble with odd bytes -- round to even */ + if (forcealign && (len & (ALIGNMENT - 1))) { #ifdef NOTUSED - if (PKTTAILROOM(osh, pkt)) + if (PKTTAILROOM(osh, pkt)) #endif - len = ROUNDUP(len, ALIGNMENT); + len = ROUNDUP(len, ALIGNMENT); #ifdef NOTUSED - else - DHD_ERROR(("%s: sending unrounded %d-byte packet\n", __FUNCTION__, len)); + else + DHD_ERROR(("%s: sending unrounded %d-byte packet\n", __FUNCTION__, len)); #endif + } + real_pad = len - act_len; + if (PKTTAILROOM(osh, pkt) < real_pad) { + DHD_INFO(("%s 3: insufficient tailroom %d for %d real_pad\n", + __FUNCTION__, (int)PKTTAILROOM(osh, pkt), real_pad)); + if (PKTPADTAILROOM(osh, pkt, real_pad)) { + DHD_ERROR(("CHK3: padding error size %d\n", real_pad)); + ret = BCME_NOMEM; + goto done; } - real_pad = len - act_len; - if (PKTTAILROOM(osh, pkt) < real_pad) { - DHD_INFO(("%s 3: insufficient tailroom %d for %d real_pad\n", - __FUNCTION__, (int)PKTTAILROOM(osh, pkt), real_pad)); - if (PKTPADTAILROOM(osh, pkt, real_pad)) { - DHD_ERROR(("CHK3: padding error size %d\n", real_pad)); - ret = BCME_NOMEM; - goto done; - } #ifndef BCMLXSDMMC - else - PKTSETLEN(osh, pkt, act_len); + else + PKTSETLEN(osh, pkt, act_len); #endif - } + } #ifdef BCMLXSDMMC - PKTSETLEN(osh, pkt, len); + PKTSETLEN(osh, pkt, len); #endif /* BCMLXSDMMC */ } do { @@ -2248,14 +2281,14 @@ dhd_bus_txdata(struct dhd_bus *bus, void *pkt) #if defined(DHD_TX_DUMP) && defined(DHD_TX_FULL_DUMP) { int i; - DHD_ERROR(("TX DUMP\n")); + DHD_ERROR(("TX DUMP\n")); - for (i = 0; i < (datalen - 4); i++) { - DHD_ERROR(("%02X ", dump_data[i])); - if ((i & 15) == 15) - printk("\n"); - } - DHD_ERROR(("\n")); + for (i = 0; i < (datalen - 4); i++) { + DHD_ERROR(("%02X ", dump_data[i])); + if ((i & 15) == 15) + printk("\n"); + } + DHD_ERROR(("\n")); } #endif /* DHD_TX_DUMP && DHD_TX_FULL_DUMP */ @@ -2309,6 +2342,7 @@ dhd_bus_txdata(struct dhd_bus *bus, void *pkt) } else ret = BCME_OK; + if ((pktq_len(&bus->txq) >= FCHI) && dhd_doflow) dhd_txflowcontrol(bus->dhd, ALL_INTERFACES, ON); @@ -2371,7 +2405,7 @@ dhdsdio_sendfromq(dhd_bus_t *bus, uint maxframes) uint cnt = 0; uint datalen; uint8 tx_prec_map; - uint8 txpktqlen = 0; + uint16 txpktqlen = 0; #ifdef BCMSDIOH_TXGLOM uint i; uint8 glom_cnt; @@ -2388,6 +2422,7 @@ dhdsdio_sendfromq(dhd_bus_t *bus, uint maxframes) } tx_prec_map = ~bus->flowcontrol; + /* Send frames until the limit or some other event */ for (cnt = 0; (cnt < maxframes) && DATAOK(bus); cnt++) { #ifdef BCMSDIOH_TXGLOM @@ -2509,7 +2544,7 @@ dhdsdio_sendpendctl(dhd_bus_t *bus) } ret = dhd_bcmsdh_send_buf(bus, bcmsdh_cur_sbwad(sdh), SDIO_FUNC_2, F2SYNC, - (uint8 *)bus->ctrl_frame_buf, (uint32)bus->ctrl_frame_len, + (uint8 *)bus->ctrl_frame_buf, (uint32)bus->ctrl_frame_len, NULL, NULL, NULL); ASSERT(ret != BCME_PENDING); if (ret == BCME_NODEVICE) { @@ -2548,6 +2583,7 @@ dhdsdio_sendpendctl(dhd_bus_t *bus) int dhd_bus_txctl(struct dhd_bus *bus, uchar *msg, uint msglen) { + static int err_nodevice = 0; uint8 *frame; uint16 len; uint32 swheader; @@ -2675,6 +2711,7 @@ dhd_bus_txctl(struct dhd_bus *bus, uchar *msg, uint msglen) } bus->dhd->txcnt_timeout = 0; + bus->ctrl_frame_stat = TRUE; if (ret == -1) { #ifdef DHD_DEBUG @@ -2725,6 +2762,7 @@ dhd_bus_txctl(struct dhd_bus *bus, uchar *msg, uint msglen) } } while ((ret < 0) && retries++ < TXRETRIES); } + bus->ctrl_frame_stat = FALSE; done: if ((bus->idletime == DHD_IDLE_IMMEDIATE) && !bus->dpc_sched) { @@ -2742,7 +2780,12 @@ dhd_bus_txctl(struct dhd_bus *bus, uchar *msg, uint msglen) if (bus->dhd->txcnt_timeout >= MAX_CNTL_TX_TIMEOUT) return -ETIMEDOUT; - return ret ? -EIO : 0; + if (ret == BCME_NODEVICE) + err_nodevice++; + else + err_nodevice = 0; + + return ret ? err_nodevice >= ERROR_BCME_NODEVICE_MAX ? -ETIMEDOUT : -EIO : 0; } int @@ -2827,7 +2870,8 @@ enum { IOV_SBREG, IOV_SDCIS, IOV_MEMBYTES, - IOV_MEMSIZE, + IOV_RAMSIZE, + IOV_RAMSTART, #ifdef DHD_DEBUG IOV_CHECKDIED, IOV_SERIALCONS, @@ -2867,7 +2911,8 @@ enum { IOV_FWPATH, #endif IOV_TXGLOMSIZE, - IOV_TXGLOMMODE + IOV_TXGLOMMODE, + IOV_HANGREPORT }; const bcm_iovar_t dhdsdio_iovars[] = { @@ -2878,7 +2923,8 @@ const bcm_iovar_t dhdsdio_iovars[] = { {"idleclock", IOV_IDLECLOCK, 0, IOVT_INT32, 0 }, {"sd1idle", IOV_SD1IDLE, 0, IOVT_BOOL, 0 }, {"membytes", IOV_MEMBYTES, 0, IOVT_BUFFER, 2 * sizeof(int) }, - {"memsize", IOV_MEMSIZE, 0, IOVT_UINT32, 0 }, + {"ramsize", IOV_RAMSIZE, 0, IOVT_UINT32, 0 }, + {"ramstart", IOV_RAMSTART, 0, IOVT_UINT32, 0 }, {"dwnldstate", IOV_SET_DOWNLOAD_STATE, 0, IOVT_BOOL, 0 }, {"socram_state", IOV_SOCRAM_STATE, 0, IOVT_BOOL, 0 }, {"vars", IOV_VARS, 0, IOVT_BUFFER, 0 }, @@ -2919,6 +2965,7 @@ const bcm_iovar_t dhdsdio_iovars[] = { #endif {"txglomsize", IOV_TXGLOMSIZE, 0, IOVT_UINT32, 0 }, {"txglommode", IOV_TXGLOMMODE, 0, IOVT_UINT32, 0 }, + {"fw_hang_report", IOV_HANGREPORT, 0, IOVT_BOOL, 0 }, {NULL, 0, 0, 0, 0 } }; @@ -2944,25 +2991,25 @@ dhd_bus_dump(dhd_pub_t *dhdp, struct bcmstrbuf *strbuf) bcm_bprintf(strbuf, "Bus SDIO structure:\n"); bcm_bprintf(strbuf, "hostintmask 0x%08x intstatus 0x%08x sdpcm_ver %d\n", bus->hostintmask, bus->intstatus, bus->sdpcm_ver); - bcm_bprintf(strbuf, "fcstate %d qlen %d tx_seq %d, max %d, rxskip %d rxlen %d rx_seq %d\n", + bcm_bprintf(strbuf, "fcstate %d qlen %u tx_seq %d, max %d, rxskip %d rxlen %u rx_seq %d\n", bus->fcstate, pktq_len(&bus->txq), bus->tx_seq, bus->tx_max, bus->rxskip, bus->rxlen, bus->rx_seq); - bcm_bprintf(strbuf, "intr %d intrcount %d lastintrs %d spurious %d\n", + bcm_bprintf(strbuf, "intr %d intrcount %u lastintrs %u spurious %u\n", bus->intr, bus->intrcount, bus->lastintrs, bus->spurious); - bcm_bprintf(strbuf, "pollrate %d pollcnt %d regfails %d\n", + bcm_bprintf(strbuf, "pollrate %u pollcnt %u regfails %u\n", bus->pollrate, bus->pollcnt, bus->regfails); bcm_bprintf(strbuf, "\nAdditional counters:\n"); - bcm_bprintf(strbuf, "tx_sderrs %d fcqueued %d rxrtx %d rx_toolong %d rxc_errors %d\n", + bcm_bprintf(strbuf, "tx_sderrs %u fcqueued %u rxrtx %u rx_toolong %u rxc_errors %u\n", bus->tx_sderrs, bus->fcqueued, bus->rxrtx, bus->rx_toolong, bus->rxc_errors); - bcm_bprintf(strbuf, "rx_hdrfail %d badhdr %d badseq %d\n", + bcm_bprintf(strbuf, "rx_hdrfail %u badhdr %u badseq %u\n", bus->rx_hdrfail, bus->rx_badhdr, bus->rx_badseq); - bcm_bprintf(strbuf, "fc_rcvd %d, fc_xoff %d, fc_xon %d\n", + bcm_bprintf(strbuf, "fc_rcvd %u, fc_xoff %u, fc_xon %u\n", bus->fc_rcvd, bus->fc_xoff, bus->fc_xon); - bcm_bprintf(strbuf, "rxglomfail %d, rxglomframes %d, rxglompkts %d\n", + bcm_bprintf(strbuf, "rxglomfail %u, rxglomframes %u, rxglompkts %u\n", bus->rxglomfail, bus->rxglomframes, bus->rxglompkts); - bcm_bprintf(strbuf, "f2rx (hdrs/data) %d (%d/%d), f2tx %d f1regs %d\n", + bcm_bprintf(strbuf, "f2rx (hdrs/data) %u (%u/%u), f2tx %u f1regs %u\n", (bus->f2rxhdrs + bus->f2rxdata), bus->f2rxhdrs, bus->f2rxdata, bus->f2txdata, bus->f1regdata); { @@ -3002,17 +3049,17 @@ dhd_bus_dump(dhd_pub_t *dhdp, struct bcmstrbuf *strbuf) #ifdef SDTEST if (bus->pktgen_count) { bcm_bprintf(strbuf, "pktgen config and count:\n"); - bcm_bprintf(strbuf, "freq %d count %d print %d total %d min %d len %d\n", + bcm_bprintf(strbuf, "freq %u count %u print %u total %u min %u len %u\n", bus->pktgen_freq, bus->pktgen_count, bus->pktgen_print, bus->pktgen_total, bus->pktgen_minlen, bus->pktgen_maxlen); - bcm_bprintf(strbuf, "send attempts %d rcvd %d fail %d\n", + bcm_bprintf(strbuf, "send attempts %u rcvd %u fail %u\n", bus->pktgen_sent, bus->pktgen_rcvd, bus->pktgen_fail); } #endif /* SDTEST */ #ifdef DHD_DEBUG bcm_bprintf(strbuf, "dpc_sched %d host interrupt%spending\n", bus->dpc_sched, (bcmsdh_intr_pending(bus->sdh) ? " " : " not ")); - bcm_bprintf(strbuf, "blocksize %d roundup %d\n", bus->blocksize, bus->roundup); + bcm_bprintf(strbuf, "blocksize %u roundup %u\n", bus->blocksize, bus->roundup); #endif /* DHD_DEBUG */ bcm_bprintf(strbuf, "clkstate %d activity %d idletime %d idlecount %d sleeping %d\n", bus->clkstate, bus->activity, bus->idletime, bus->idlecount, bus->sleeping); @@ -3551,6 +3598,7 @@ dhd_serialconsole(dhd_bus_t *bus, bool set, bool enable, int *bcmerror) uart_enab = CC_PLL_CHIPCTRL_SERIAL_ENAB; } else if (bus->sih->chip == BCM4334_CHIP_ID || + bus->sih->chip == BCM43340_CHIP_ID || bus->sih->chip == BCM43341_CHIP_ID || 0) { if (enable) { @@ -3750,13 +3798,13 @@ dhdsdio_doiovar(dhd_bus_t *bus, const bcm_iovar_t *vi, uint32 actionid, const ch /* check if CR4 */ if (si_setcore(bus->sih, ARMCR4_CORE_ID, 0)) { - /* if address is 0, store the reset instruction to be written in 0 */ - - if (address == 0) { + /* + * If address is start of RAM (i.e. a downloaded image), + * store the reset instruction to be written in 0 + */ + if (address == bus->dongle_ram_base) { bus->resetinstr = *(((uint32*)params) + 2); } - /* Add start of RAM address to the address given by user */ - address += bus->dongle_ram_base; } else { /* If we know about SOCRAM, check for a fit */ if ((bus->orig_ramsize) && @@ -3810,11 +3858,16 @@ dhdsdio_doiovar(dhd_bus_t *bus, const bcm_iovar_t *vi, uint32 actionid, const ch break; } - case IOV_GVAL(IOV_MEMSIZE): + case IOV_GVAL(IOV_RAMSIZE): int_val = (int32)bus->ramsize; bcopy(&int_val, arg, val_size); break; + case IOV_GVAL(IOV_RAMSTART): + int_val = (int32)bus->dongle_ram_base; + bcopy(&int_val, arg, val_size); + break; + case IOV_GVAL(IOV_SDIOD_DRIVE): int_val = (int32)dhd_sdiod_drive_strength; bcopy(&int_val, arg, val_size); @@ -4171,6 +4224,15 @@ dhdsdio_doiovar(dhd_bus_t *bus, const bcm_iovar_t *vi, uint32 actionid, const ch } break; #endif /* BCMSDIOH_TXGLOM */ + case IOV_SVAL(IOV_HANGREPORT): + bus->dhd->hang_report = bool_val; + DHD_ERROR(("%s: Set hang_report as %d\n", __FUNCTION__, bus->dhd->hang_report)); + break; + + case IOV_GVAL(IOV_HANGREPORT): + int_val = (int32)bus->dhd->hang_report; + bcopy(&int_val, arg, val_size); + break; default: bcmerror = BCME_UNSUPPORTED; break; @@ -4513,7 +4575,8 @@ dhd_bus_iovar_op(dhd_pub_t *dhdp, const char *name, DHD_INFO(("%s: noted %s update, value now %d\n", __FUNCTION__, "sd_blocksize", bus->blocksize)); - if (bus->sih->chip == BCM4335_CHIP_ID) + if ((bus->sih->chip == BCM4335_CHIP_ID) || + (bus->sih->chip == BCM4339_CHIP_ID)) dhd_overflow_war(bus); } } @@ -4787,7 +4850,8 @@ dhd_bus_init(dhd_pub_t *dhdp, bool enforce_mutex) mesbusyctrl = watermark = bus->blocksize / 4; } #endif /* SDIO_CRC_ERROR_FIX */ - if (bus->sih->chip != BCM4335_CHIP_ID) { + if (!((bus->sih->chip == BCM4335_CHIP_ID) || + (bus->sih->chip == BCM4339_CHIP_ID))) { bcmsdh_cfg_write(bus->sdh, SDIO_FUNC_1, SBSDIO_WATERMARK, (uint8)watermark, &err); } @@ -4806,7 +4870,9 @@ dhd_bus_init(dhd_pub_t *dhdp, bool enforce_mutex) bus->intdis = FALSE; if (bus->intr) { DHD_INTR(("%s: enable SDIO device interrupts\n", __FUNCTION__)); +#ifndef BCMSPI_ANDROID bcmsdh_intr_enable(bus->sdh); +#endif /* !BCMSPI_ANDROID */ } else { DHD_INTR(("%s: disable SDIO interrupts\n", __FUNCTION__)); bcmsdh_intr_disable(bus->sdh); @@ -4828,7 +4894,7 @@ dhd_bus_init(dhd_pub_t *dhdp, bool enforce_mutex) bus->hostintmask &= ~I_CHIPACTIVE; W_SDREG(bus->hostintmask, &bus->regs->hostintmask, retries); DHD_INFO(("%s: disable I_CHIPACTIVE in hostintmask[0x%08x]\n", - __FUNCTION__, bus->hostintmask)); + __FUNCTION__, bus->hostintmask)); } else bcmsdh_cfg_write(bus->sdh, SDIO_FUNC_1, @@ -5019,6 +5085,9 @@ dhdsdio_read_control(dhd_bus_t *bus, uint8 *hdr, uint len, uint doff) /* Awake any waiters */ dhd_os_ioctl_resp_wake(bus->dhd); } +int +dhd_process_pkt_reorder_info(dhd_pub_t *dhd, uchar *reorder_info_buf, uint reorder_info_len, + void **pkt, uint32 *pkt_count); static uint8 dhdsdio_rxglom(dhd_bus_t *bus, uint8 rxseq) @@ -5389,14 +5458,11 @@ dhdsdio_rxglom(dhd_bus_t *bus, uint8 rxseq) temp = PKTNEXT(osh, temp); } pfirst = temp; - if (list_tail[ifidx] == NULL) { + if (list_tail[ifidx] == NULL) list_head[ifidx] = ppfirst; - list_tail[ifidx] = pfirst; - } - else { + else PKTSETNEXT(osh, list_tail[ifidx], ppfirst); - list_tail[ifidx] = pfirst; - } + list_tail[ifidx] = pfirst; } num += (uint8)free_buf_count; @@ -5451,12 +5517,7 @@ dhdsdio_rxglom(dhd_bus_t *bus, uint8 rxseq) /* Return TRUE if there may be more frames to read */ static uint -#ifdef REPEAT_READFRAME -dhdsdio_readframes(dhd_bus_t *bus, uint maxframes, bool *finished, bool tx_enable) -#else dhdsdio_readframes(dhd_bus_t *bus, uint maxframes, bool *finished) -#endif - { osl_t *osh = bus->dhd->osh; bcmsdh_info_t *sdh = bus->sdh; @@ -5510,6 +5571,7 @@ dhdsdio_readframes(dhd_bus_t *bus, uint maxframes, bool *finished) /* Not finished unless we encounter no more frames indication */ *finished = FALSE; + #ifdef BCMSPI /* Get pktlen from gSPI device F0 reg. */ if (bus->bus == SPI_BUS) { @@ -5548,19 +5610,10 @@ dhdsdio_readframes(dhd_bus_t *bus, uint maxframes, bool *finished) rxseq++, rxleft--) { #ifdef DHDTHREAD - - if ( -#ifdef REPEAT_READFRAME - tx_enable && -#endif - TXCTLOK(bus) && bus->ctrl_frame_stat && (bus->clkstate == CLK_AVAIL)) - dhdsdio_sendpendctl(bus); /* tx more to improve rx performance */ - else if ( -#ifdef REPEAT_READFRAME - tx_enable && -#endif - (bus->clkstate == CLK_AVAIL) && !bus->fcstate && + if (TXCTLOK(bus) && bus->ctrl_frame_stat && (bus->clkstate == CLK_AVAIL)) { + dhdsdio_sendpendctl(bus); + } else if ((bus->clkstate == CLK_AVAIL) && !bus->fcstate && pktq_mlen(&bus->txq, ~bus->flowcontrol) && DATAOK(bus)) { dhdsdio_sendfromq(bus, dhd_txbound); } @@ -6294,10 +6347,6 @@ dhdsdio_hostmail(dhd_bus_t *bus) return intstatus; } -#ifdef REPEAT_READFRAME -extern uint dhd_dpcpoll; -#endif - static bool dhdsdio_dpc(dhd_bus_t *bus) { @@ -6312,20 +6361,22 @@ dhdsdio_dpc(dhd_bus_t *bus) bool resched = FALSE; /* Flag indicating resched wanted */ #if defined(CUSTOMER_HW4) bool is_resched_by_readframe = FALSE; -#endif /* CUSTOMER_HW4 */ +#endif DHD_TRACE(("%s: Enter\n", __FUNCTION__)); + dhd_os_sdlock(bus->dhd); + if (bus->dhd->busstate == DHD_BUS_DOWN) { DHD_ERROR(("%s: Bus down, ret\n", __FUNCTION__)); bus->intstatus = 0; + dhd_os_sdunlock(bus->dhd); + return 0; } /* Start with leftover status bits */ intstatus = bus->intstatus; - dhd_os_sdlock(bus->dhd); - if (!SLPAUTO_ENAB(bus) && !KSO_ENAB(bus)) { DHD_ERROR(("%s: Device asleep\n", __FUNCTION__)); goto exit; @@ -6377,6 +6428,7 @@ dhdsdio_dpc(dhd_bus_t *bus) } BUS_WAKE(bus); + /* Make sure backplane clock is on */ dhdsdio_clkctl(bus, CLK_AVAIL, TRUE); if (bus->clkstate != CLK_AVAIL) @@ -6407,7 +6459,6 @@ dhdsdio_dpc(dhd_bus_t *bus) intstatus |= newstatus; bus->intstatus = 0; - /* Handle flow-control change: read new state in case our ack * crossed another change interrupt. If change still set, assume * FC ON for safety, let next loop through do the debounce. @@ -6462,11 +6513,7 @@ dhdsdio_dpc(dhd_bus_t *bus) /* On frame indication, read available frames */ if (PKT_AVAILABLE(bus, intstatus)) { -#ifdef REPEAT_READFRAME - framecnt = dhdsdio_readframes(bus, rxlimit, &rxdone, true); -#else framecnt = dhdsdio_readframes(bus, rxlimit, &rxdone); -#endif if (rxdone || bus->rxskip) intstatus &= ~FRAME_AVAIL_MASK(bus); rxlimit -= MIN(framecnt, rxlimit); @@ -6484,10 +6531,14 @@ dhdsdio_dpc(dhd_bus_t *bus) DHD_INTR(("%s: enable SDIO interrupts, rxdone %d framecnt %d\n", __FUNCTION__, rxdone, framecnt)); bus->intdis = FALSE; -#if defined(OOB_INTR_ONLY) || defined(BCMSPI_ANDROID) - bcmsdh_oob_intr_set(1); -#endif /* defined(OOB_INTR_ONLY) || defined(BCMSPI_ANDROID) */ +#if defined(OOB_INTR_ONLY) + bcmsdh_oob_intr_set(1); +#endif /* defined(OOB_INTR_ONLY) */ bcmsdh_intr_enable(sdh); +#ifdef BCMSPI_ANDROID + if (*dhd_spi_lockcount == 0) + bcmsdh_oob_intr_set(1); +#endif /* BCMSPI_ANDROID */ } #if defined(OOB_INTR_ONLY) && !defined(HW_OOB) @@ -6510,9 +6561,9 @@ dhdsdio_dpc(dhd_bus_t *bus) dhd_wlfc_trigger_pktcommit(bus->dhd); #endif - if (TXCTLOK(bus) && bus->ctrl_frame_stat && (bus->clkstate == CLK_AVAIL)) dhdsdio_sendpendctl(bus); + /* Send queued frames (limit 1 if rx may still be pending) */ else if ((bus->clkstate == CLK_AVAIL) && !bus->fcstate && pktq_mlen(&bus->txq, ~bus->flowcontrol) && txlimit && DATAOK(bus)) { @@ -6555,16 +6606,15 @@ dhdsdio_dpc(dhd_bus_t *bus) } exit: -#ifdef REPEAT_READFRAME + if (!resched && dhd_dpcpoll) { - if (dhdsdio_readframes(bus, dhd_rxbound, &rxdone, true) != 0) { + if (dhdsdio_readframes(bus, dhd_rxbound, &rxdone) != 0) { resched = TRUE; #if defined(CUSTOMER_HW4) is_resched_by_readframe = TRUE; -#endif /* CUSTOMER_HW4 */ +#endif } } -#endif /* REPEAT_READFRAME */ dhd_os_sdunlock(bus->dhd); #if defined(CUSTOMER_HW4) @@ -6577,7 +6627,7 @@ dhdsdio_dpc(dhd_bus_t *bus) bus->dhd->dhd_bug_on = FALSE; } -#endif /* CUSTOMER_HW4 */ +#endif return resched; } @@ -6635,15 +6685,19 @@ dhdsdio_isr(void *arg) DHD_ERROR(("dhdsdio_isr() w/o interrupt configured!\n")); } +#ifdef BCMSPI_ANDROID + bcmsdh_oob_intr_set(0); +#endif /* BCMSPI_ANDROID */ bcmsdh_intr_disable(sdh); bus->intdis = TRUE; #if defined(SDIO_ISR_THREAD) DHD_TRACE(("Calling dhdsdio_dpc() from %s\n", __FUNCTION__)); DHD_OS_WAKE_LOCK(bus->dhd); - while (dhdsdio_dpc(bus)); + dhdsdio_dpc(bus); DHD_OS_WAKE_UNLOCK(bus->dhd); #else + bus->dpc_sched = TRUE; dhd_sched_dpc(bus->dhd); @@ -6974,6 +7028,9 @@ dhd_bus_watchdog(dhd_pub_t *dhdp) if (bus->dhd->dongle_reset) return FALSE; + if (bus->dhd->hang_was_sent) + return FALSE; + /* Ignore the timer if simulating bus down */ if (!SLPAUTO_ENAB(bus) && bus->sleeping) return FALSE; @@ -7061,7 +7118,7 @@ dhd_bus_watchdog(dhd_pub_t *dhdp) else { bus->idlecount++; - if (bus->idlecount >= bus->idletime) { + if ((bus->idletime > 0) && (bus->idlecount >= bus->idletime)) { DHD_TIMER(("%s: DHD Idle state!!\n", __FUNCTION__)); if (SLPAUTO_ENAB(bus)) { if (dhdsdio_bussleep(bus, TRUE) != BCME_BUSY) @@ -7074,7 +7131,7 @@ dhd_bus_watchdog(dhd_pub_t *dhdp) } #else if ((bus->idletime > 0) && (bus->clkstate == CLK_AVAIL)) { - if (++bus->idlecount > bus->idletime) { + if (++bus->idlecount >= bus->idletime) { bus->idlecount = 0; if (bus->activity) { bus->activity = FALSE; @@ -7209,6 +7266,8 @@ dhdsdio_chipmatch(uint16 chipid) return TRUE; if (chipid == BCM43242_CHIP_ID) return TRUE; + if (chipid == BCM43340_CHIP_ID) + return TRUE; if (chipid == BCM43341_CHIP_ID) return TRUE; if (chipid == BCM43143_CHIP_ID) @@ -7223,6 +7282,8 @@ dhdsdio_chipmatch(uint16 chipid) return TRUE; if (chipid == BCM4335_CHIP_ID) return TRUE; + if (chipid == BCM4339_CHIP_ID) + return TRUE; if (chipid == BCM4350_CHIP_ID) return TRUE; return FALSE; @@ -7238,6 +7299,7 @@ dhdsdio_probe(uint16 venid, uint16 devid, uint16 bus_no, uint16 slot, struct ether_addr ea_addr; #endif /* GET_CUSTOM_MAC_ENABLE */ +#if defined(MULTIPLE_SUPPLICANT) #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25)) if (mutex_is_locked(&_dhd_sdio_mutex_lock_) == 0) { DHD_ERROR(("%s : no mutex held. set lock\n", __FUNCTION__)); @@ -7247,6 +7309,7 @@ dhdsdio_probe(uint16 venid, uint16 devid, uint16 bus_no, uint16 slot, } mutex_lock(&_dhd_sdio_mutex_lock_); #endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25)) */ +#endif /* Init global variables at run-time, not as part of the declaration. * This is required to support init/de-init of the driver. Initialization @@ -7264,12 +7327,12 @@ dhdsdio_probe(uint16 venid, uint16 devid, uint16 bus_no, uint16 slot, sd1idle = TRUE; dhd_readahead = TRUE; retrydata = FALSE; -#ifndef REPEAT_READFRAME +#if !defined(PLATFORM_MPS) && !defined(CUSTOMER_HW4) dhd_doflow = FALSE; #else dhd_doflow = TRUE; -#endif /* REPEAT_READFRAME */ - dhd_dongle_memsize = 0; +#endif /* OEM_ANDROID */ + dhd_dongle_ramsize = 0; dhd_txminmax = DHD_TXMINMAX; #ifdef BCMSPI @@ -7406,6 +7469,7 @@ dhdsdio_probe(uint16 venid, uint16 devid, uint16 bus_no, uint16 slot, #endif /* GET_CUSTOM_MAC_ENABLE */ /* if firmware path present try to download and bring up bus */ + bus->dhd->hang_report = TRUE; if (dhd_download_fw_on_driverload) { if ((ret = dhd_bus_start(bus->dhd)) != 0) { DHD_ERROR(("%s: dhd_bus_start failed\n", __FUNCTION__)); @@ -7433,10 +7497,12 @@ dhdsdio_probe(uint16 venid, uint16 devid, uint16 bus_no, uint16 slot, bcmsdh_reg_write(bus->sdh, 0x18000628, 4, 0x00F80001); #endif +#if defined(MULTIPLE_SUPPLICANT) #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25)) mutex_unlock(&_dhd_sdio_mutex_lock_); DHD_ERROR(("%s : the lock is released.\n", __FUNCTION__)); #endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) */ +#endif return bus; @@ -7444,10 +7510,12 @@ dhdsdio_probe(uint16 venid, uint16 devid, uint16 bus_no, uint16 slot, dhdsdio_release(bus, osh); forcereturn: +#if defined(MULTIPLE_SUPPLICANT) #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25)) mutex_unlock(&_dhd_sdio_mutex_lock_); DHD_ERROR(("%s : the lock is released.\n", __FUNCTION__)); #endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) */ +#endif return NULL; } @@ -7469,13 +7537,7 @@ dhdsdio_probe_attach(struct dhd_bus *bus, osl_t *osh, void *sdh, void *regsva, DHD_ERROR(("%s: FAILED to return to SI_ENUM_BASE\n", __FUNCTION__)); } -#ifdef DHD_DEBUG - DHD_ERROR(("F1 signature read @0x18000000=0x%4x\n", - bcmsdh_reg_read(bus->sdh, SI_ENUM_BASE, 4))); - -#endif /* DHD_DEBUG */ - -#ifndef BCMSPI /* wake-wlan in gSPI will bring up the htavail/alpavail clocks. */ +#ifndef BCMSPI /* wake-wlan in gSPI will bring up the htavail/alpavail clocks. */ /* Force PLL off until si_attach() programs PLL control regs */ @@ -7551,6 +7613,13 @@ dhdsdio_probe_attach(struct dhd_bus *bus, osl_t *osh, void *sdh, void *regsva, } +#ifdef DHD_DEBUG + DHD_ERROR(("F1 signature OK, socitype:0x%x chip:0x%4x rev:0x%x pkg:0x%x\n", + bus->sih->socitype, bus->sih->chip, bus->sih->chiprev, + bus->sih->chippkg)); +#endif /* DHD_DEBUG */ + + bcmsdh_chipinfo(sdh, bus->sih->chip, bus->sih->chiprev); if (!dhdsdio_chipmatch((uint16)bus->sih->chip)) { @@ -7595,6 +7664,7 @@ dhdsdio_probe_attach(struct dhd_bus *bus, osl_t *osh, void *sdh, void *regsva, /* also populate base address */ switch ((uint16)bus->sih->chip) { case BCM4335_CHIP_ID: + case BCM4339_CHIP_ID: bus->dongle_ram_base = CR4_4335_RAM_BASE; break; case BCM4350_CHIP_ID: @@ -7610,8 +7680,8 @@ dhdsdio_probe_attach(struct dhd_bus *bus, osl_t *osh, void *sdh, void *regsva, } } bus->ramsize = bus->orig_ramsize; - if (dhd_dongle_memsize) - dhd_dongle_setmemsize(bus, dhd_dongle_memsize); + if (dhd_dongle_ramsize) + dhd_dongle_setramsize(bus, dhd_dongle_ramsize); DHD_ERROR(("DHD: dongle ram size is set to %d(orig %d) at 0x%x\n", bus->ramsize, bus->orig_ramsize, bus->dongle_ram_base)); @@ -7768,7 +7838,8 @@ dhdsdio_probe_init(dhd_bus_t *bus, osl_t *osh, void *sdh) DHD_INFO(("%s: Initial value for %s is %d\n", __FUNCTION__, "sd_blocksize", bus->blocksize)); - if (bus->sih->chip == BCM4335_CHIP_ID) + if ((bus->sih->chip == BCM4335_CHIP_ID) || + (bus->sih->chip == BCM4339_CHIP_ID)) dhd_overflow_war(bus); } bus->roundup = MIN(max_roundup, bus->blocksize); @@ -7814,6 +7885,17 @@ dhdsdio_download_firmware(struct dhd_bus *bus, osl_t *osh, void *sdh) { bool ret; +#if defined(SUPPORT_MULTIPLE_REVISION) + if (concate_revision(bus, bus->fw_path, sizeof(bus->fw_path), + bus->nv_path, sizeof(bus->nv_path)) != 0) { + DHD_ERROR(("%s: fail to concatnate revison \n", + __FUNCTION__)); + return BCME_BADARG; + } +#endif /* SUPPORT_MULTIPLE_REVISION */ + + DHD_TRACE_HW4(("%s: firmware path=%s, nvram path=%s\n", + __FUNCTION__, bus->fw_path, bus->nv_path)); DHD_OS_WAKE_LOCK(bus->dhd); /* Download the firmware */ @@ -7936,6 +8018,7 @@ dhdsdio_disconnect(void *ptr) DHD_TRACE(("%s: Enter\n", __FUNCTION__)); +#if defined(MULTIPLE_SUPPLICANT) #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25)) if (mutex_is_locked(&_dhd_sdio_mutex_lock_) == 0) { DHD_ERROR(("%s : no mutex held. set lock\n", __FUNCTION__)); @@ -7945,6 +8028,7 @@ dhdsdio_disconnect(void *ptr) } mutex_lock(&_dhd_sdio_mutex_lock_); #endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25)) */ +#endif if (bus) { @@ -7952,10 +8036,12 @@ dhdsdio_disconnect(void *ptr) dhdsdio_release(bus, bus->dhd->osh); } +#if defined(MULTIPLE_SUPPLICANT) #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25)) mutex_unlock(&_dhd_sdio_mutex_lock_); DHD_ERROR(("%s : the lock is released.\n", __FUNCTION__)); #endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25)) */ +#endif /* LINUX */ DHD_TRACE(("%s: Disconnected\n", __FUNCTION__)); @@ -8453,10 +8539,15 @@ dhd_bus_devreset(dhd_pub_t *dhdp, uint8 flag) bcmerror = dhd_bus_init((dhd_pub_t *) bus->dhd, FALSE); if (bcmerror == BCME_OK) { #if defined(OOB_INTR_ONLY) || defined(BCMSPI_ANDROID) + /* make sure oob intr get registered */ + if (!bcmsdh_is_oob_intr_registered()) { + sdioh_start(NULL, 1); + bcmsdh_register_oob_intr(dhdp); + dhdp->iswl = TRUE; + } + bcmsdh_set_irq(TRUE); -#ifndef BCMSPI_ANDROID dhd_enable_oob_intr(bus, TRUE); -#endif /* !BCMSPI_ANDROID */ #endif /* defined(OOB_INTR_ONLY) || defined(BCMSPI_ANDROID) */ bus->dhd->dongle_reset = FALSE; @@ -8503,6 +8594,22 @@ uint dhd_bus_chip_id(dhd_pub_t *dhdp) return bus->sih->chip; } + +/* Get Chip Rev ID version */ +uint dhd_bus_chiprev_id(dhd_pub_t *dhdp) +{ + dhd_bus_t *bus = dhdp->bus; + + return bus->sih->chiprev; +} + +/* Get Chip Pkg ID version */ +uint dhd_bus_chippkg_id(dhd_pub_t *dhdp) +{ + dhd_bus_t *bus = dhdp->bus; + + return bus->sih->chippkg; +} int dhd_bus_membytes(dhd_pub_t *dhdp, bool set, uint32 address, uint8 *data, uint size) { @@ -8511,9 +8618,26 @@ dhd_bus_membytes(dhd_pub_t *dhdp, bool set, uint32 address, uint8 *data, uint si bus = dhdp->bus; return dhdsdio_membytes(bus, set, address, data, size); } -#if defined(CUSTOMER_HW4) && defined(SUPPORT_MULTIPLE_REVISION) +#if defined(SUPPORT_MULTIPLE_REVISION) +/* Just print chip revision for BCM4330 */ +static int +concate_revision_bcm4330(dhd_bus_t *bus) +{ + uint chipver; + chipver = bus->sih->chiprev; + + if (chipver == 3) + DHD_ERROR(("---- CHIP bcm4330 B1 ----\n")); + else if (chipver == 4) + DHD_ERROR(("---- CHIP bcm4330 B2 ----\n")); + else + DHD_ERROR(("----- Invalid chip version -----\n")); + return 0; +} + static int -concate_revision_bcm4334(dhd_bus_t *bus, char *path, int path_len) +concate_revision_bcm4334(dhd_bus_t *bus, + char *fw_path, int fw_path_len, char *nv_path, int nv_path_len) { #define REV_ID_ADDR 0x1E008F90 #define BCM4334_B1_UNIQUE 0x30312E36 @@ -8521,7 +8645,11 @@ concate_revision_bcm4334(dhd_bus_t *bus, char *path, int path_len) uint chipver; uint32 unique_id; uint8 data[4]; - char chipver_tag[4] = "_b?"; +#if defined(SUPPORT_MULTIPLE_CHIPS) + char chipver_tag[10] = "_4334"; +#else + char chipver_tag[4] = ""; +#endif /* defined(SUPPORT_MULTIPLE_CHIPS) */ DHD_TRACE(("%s: BCM4334 Multiple Revision Check\n", __FUNCTION__)); if (bus->sih->chip != BCM4334_CHIP_ID) { @@ -8538,19 +8666,24 @@ concate_revision_bcm4334(dhd_bus_t *bus, char *path, int path_len) DHD_ERROR(("CHIP VER = [0x%x]\n", chipver)); if (chipver == 1) { DHD_ERROR(("----- CHIP bcm4334_B0 -----\n")); - strcpy(chipver_tag, "_b0"); + strcat(chipver_tag, "_b0"); } else if (chipver == 2) { DHD_ERROR(("----- CHIP bcm4334_B1 -----\n")); - strcpy(chipver_tag, "_b1"); + strcat(chipver_tag, "_b1"); } else if (chipver == 3) { DHD_ERROR(("----- CHIP bcm4334_B2 -----\n")); - strcpy(chipver_tag, "_b2"); + strcat(chipver_tag, "_b2"); } else { DHD_ERROR(("----- Invalid chip version -----\n")); return -1; } - strcat(path, chipver_tag); + + strcat(fw_path, chipver_tag); +#if defined(SUPPORT_MULTIPLE_CHIPS) + strcat(nv_path, chipver_tag); +#endif /* defined(SUPPORT_MULTIPLE_CHIPS) */ + #undef REV_ID_ADDR #undef BCM4334_B1_UNIQUE return 0; @@ -8562,7 +8695,11 @@ concate_revision_bcm4335 { uint chipver; +#if defined(SUPPORT_MULTIPLE_CHIPS) + char chipver_tag[10] = "_4335"; +#else char chipver_tag[4] = {0, }; +#endif /* defined(SUPPORT_MULTIPLE_CHIPS) */ DHD_TRACE(("%s: BCM4335 Multiple Revision Check\n", __FUNCTION__)); if (bus->sih->chip != BCM4335_CHIP_ID) { @@ -8573,32 +8710,234 @@ concate_revision_bcm4335 DHD_ERROR(("CHIP VER = [0x%x]\n", chipver)); if (chipver == 0x0) { DHD_ERROR(("----- CHIP bcm4335_A0 -----\n")); - strcpy(chipver_tag, "_a0"); + strcat(chipver_tag, "_a0"); } else if (chipver == 0x1) { DHD_ERROR(("----- CHIP bcm4335_B0 -----\n")); +#if defined(SUPPORT_MULTIPLE_CHIPS) + strcat(chipver_tag, "_b0"); +#endif /* defined(SUPPORT_MULTIPLE_CHIPS) */ } + strcat(fw_path, chipver_tag); strcat(nv_path, chipver_tag); + return 0; +} +static int +concate_revision_bcm4339 + (dhd_bus_t *bus, char *fw_path, int fw_path_len, char *nv_path, int nv_path_len) +{ + + uint chipver; +#if defined(SUPPORT_MULTIPLE_CHIPS) + char chipver_tag[10] = "_4339"; +#else + char chipver_tag[4] = {0, }; +#endif /* defined(SUPPORT_MULTIPLE_CHIPS) */ + + DHD_TRACE(("%s: BCM4339 Multiple Revision Check\n", __FUNCTION__)); + if (bus->sih->chip != BCM4339_CHIP_ID) { + DHD_ERROR(("%s:Chip is not BCM4339\n", __FUNCTION__)); + return -1; + } + chipver = bus->sih->chiprev; + DHD_ERROR(("CHIP VER = [0x%x]\n", chipver)); + if (chipver == 0x1) { + DHD_ERROR(("----- CHIP bcm4339_A0 -----\n")); + strcat(chipver_tag, "_a0"); + } else { + DHD_ERROR(("----- CHIP bcm4339 unknown revision %d -----\n", + chipver)); + } + + strcat(fw_path, chipver_tag); + strcat(nv_path, chipver_tag); return 0; +} +static int concate_revision_bcm43241(dhd_bus_t *bus, + char *fw_path, int fw_path_len, char *nv_path, int nv_path_len) +{ + uint32 chip_id, chip_ver; +#if defined(SUPPORT_MULTIPLE_CHIPS) + char chipver_tag[10] = "_43241"; +#else + char chipver_tag[4] = {0, }; +#endif /* defined(SUPPORT_MULTIPLE_CHIPS) */ + + DHD_TRACE(("%s: BCM43241 Multiple Revision Check\n", __FUNCTION__)); + + chip_id = bus->sih->chip; + chip_ver = bus->sih->chiprev; + + if (chip_ver == 2) { + DHD_ERROR(("----- CHIP bcm43241_B0 -----\n")); + strcat(chipver_tag, "_b0"); + } else if (chip_ver == 5) { + DHD_ERROR(("----- CHIP bcm43241_B4 -----\n")); + strcat(chipver_tag, "_b4"); + } else { + DHD_ERROR(("----- Invalid chip version -----\n")); + return -1; + } + + strcat(fw_path, chipver_tag); + strcat(nv_path, chipver_tag); + return 0; } + +static int +concate_revision_bcm43341 + (dhd_bus_t *bus, char *fw_path, int fw_path_len, char *nv_path, int nv_path_len) +{ + uint chipver; +#if defined(SUPPORT_MULTIPLE_CHIPS) + char chipver_tag[10] = "_43341"; +#else + char chipver_tag[4] = {0, }; +#endif /* defined(SUPPORT_MULTIPLE_CHIPS) */ + + DHD_TRACE(("%s: BCM43341 Multiple Revision Check\n", __FUNCTION__)); + if (bus->sih->chip != BCM43341_CHIP_ID) { + DHD_ERROR(("%s:Chip is not BCM43341\n", __FUNCTION__)); + return -1; + } + chipver = bus->sih->chiprev; + DHD_ERROR(("CHIP VER = [0x%x]\n", chipver)); + if (chipver == 0x1) { + DHD_ERROR(("----- CHIP bcm43341_A0 -----\n")); + strcat(chipver_tag, "_a0"); + } else if (chipver == 0x2) { + DHD_ERROR(("----- CHIP bcm43341_B0 -----\n")); + strcat(chipver_tag, "_b0"); + } else { + DHD_ERROR(("----- CHIP bcm43341 unknown revision %d -----\n", + chipver)); + } + + strcat(fw_path, chipver_tag); + strcat(nv_path, chipver_tag); + return 0; +} + + int concate_revision(dhd_bus_t *bus, char *fw_path, int fw_path_len, char *nv_path, int nv_path_len) { + int res = 0; + if (!bus || !bus->sih) { DHD_ERROR(("%s:Bus is Invalid\n", __FUNCTION__)); return -1; } + +#if defined(PLATFORM_MPS) +/* get the base name (prefix) for firmware & nvram from the platform */ + wifi_get_fw_nv_path(fw_path, nv_path); +#endif + switch (bus->sih->chip) { - case BCM4334_CHIP_ID: - return concate_revision_bcm4334(bus, fw_path, fw_path_len); - case BCM4335_CHIP_ID: - return concate_revision_bcm4335(bus, fw_path, fw_path_len, - nv_path, nv_path_len); + case BCM4330_CHIP_ID: + res = concate_revision_bcm4330(bus); + break; + case BCM4334_CHIP_ID: + res = concate_revision_bcm4334(bus, fw_path, fw_path_len, + nv_path, nv_path_len); + break; + case BCM4335_CHIP_ID: + res = concate_revision_bcm4335(bus, fw_path, fw_path_len, + nv_path, nv_path_len); + break; + case BCM4339_CHIP_ID: + res = concate_revision_bcm4339(bus, fw_path, fw_path_len, + nv_path, nv_path_len); + break; + case BCM4324_CHIP_ID: + res = concate_revision_bcm43241(bus, fw_path, fw_path_len, nv_path, nv_path_len); + break; + case BCM43341_CHIP_ID: + res = concate_revision_bcm43341(bus, fw_path, fw_path_len, + nv_path, nv_path_len); + break; + default: + DHD_ERROR(("REVISION SPECIFIC feature is not required\n")); + return res; } - DHD_ERROR(("REVISION SPECIFIC feature is not required\n")); - return 0; + if (res == 0) { + } + return res; +} +#endif /* SUPPORT_MULTIPLE_REVISION */ + +void +dhd_bus_update_fw_nv_path(struct dhd_bus *bus, char *pfw_path, char *pnv_path) +{ + bus->fw_path = pfw_path; + bus->nv_path = pnv_path; +} + +int +dhd_enableOOB(dhd_pub_t *dhd, bool sleep) +{ + dhd_bus_t *bus = dhd->bus; + sdpcmd_regs_t *regs = bus->regs; + uint retries = 0; + + if (sleep) { + dhdsdio_clkctl(bus, CLK_AVAIL, FALSE); + /* Tell device to start using OOB wakeup */ + W_SDREG(SMB_USE_OOB, ®s->tosbmailbox, retries); + if (retries > retry_limit) { + DHD_ERROR(("CANNOT SIGNAL CHIP, WILL NOT WAKE UP!!\n")); + return BCME_BUSY; + } + /* Turn off our contribution to the HT clock request */ + dhdsdio_clkctl(bus, CLK_SDONLY, FALSE); + } else { + /* Make sure the controller has the bus up */ + dhdsdio_clkctl(bus, CLK_AVAIL, FALSE); + + /* Send misc interrupt to indicate OOB not needed */ + W_SDREG(0, ®s->tosbmailboxdata, retries); + if (retries <= retry_limit) + W_SDREG(SMB_DEV_INT, ®s->tosbmailbox, retries); + + if (retries > retry_limit) + DHD_ERROR(("CANNOT SIGNAL CHIP TO CLEAR OOB!!\n")); + + /* Make sure we have SD bus access */ + dhdsdio_clkctl(bus, CLK_SDONLY, FALSE); + } + return BCME_OK; +} + +void +dhd_bus_pktq_flush(dhd_pub_t *dhdp) +{ + dhd_bus_t *bus = dhdp->bus; + /* Clear the data packet queues */ + pktq_flush(dhdp->osh, &bus->txq, TRUE, NULL, 0); +} + +int +dhd_sr_config(dhd_pub_t *dhd, bool on) +{ + dhd_bus_t *bus = dhd->bus; + + if (!bus->_srenab) + return -1; + + return dhdsdio_clk_devsleep_iovar(bus, on); +} + +uint16 +dhd_get_chipid(dhd_pub_t *dhd) +{ + dhd_bus_t *bus = dhd->bus; + + if (bus && bus->sih) + return (uint16)bus->sih->chip; + else + return 0; } -#endif /* CUSTOMER_HW4 && SUPPORT_MULTIPLE_REVISION */ diff --git a/drivers/net/wireless/bcmdhd/dhd_sec_feature.h b/drivers/net/wireless/bcmdhd/dhd_sec_feature.h index 5aacf20fb95..b296f4cd823 100644 --- a/drivers/net/wireless/bcmdhd/dhd_sec_feature.h +++ b/drivers/net/wireless/bcmdhd/dhd_sec_feature.h @@ -1,7 +1,7 @@ /* * Customer HW 4 dependant file * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -24,13 +24,51 @@ * $Id: dhd_sec_feature.h$ */ +/* +*** Desciption *** +1. Module vs COB + If your model's WIFI HW chip is COB type, you must add below feature + - #undef USE_CID_CHECK + - #define READ_MACADDR + Because COB type chip have not CID and Mac address. + So, you must add below feature to defconfig file. + - CONFIG_WIFI_BROADCOM_COB + +2. PROJECTS + If you want add some feature only own Project, you can add it in 'PROJECTS' part. + +3. Region code + If you want add some feature only own region model, you can use below code. + - 100 : EUR OPEN + - 101 : EUR ORG + - 200 : KOR OPEN + - 201 : KOR SKT + - 202 : KOR KTT + - 203 : KOR LGT + - 300 : CHN OPEN + - 400 : USA OPEN + - 401 : USA ATT + - 402 : USA TMO + - 403 : USA VZW + - 404 : USA SPR + - 405 : USA USC + You can refer how to using it below this file. + And, you can add more region code, too. +*/ + #ifndef _dhd_sec_feature_h_ #define _dhd_sec_feature_h_ -/* PROJECTS */ +/* For COB type feature */ +#ifdef CONFIG_WIFI_BROADCOM_COB +#undef USE_CID_CHECK +#define READ_MACADDR +#endif /* CONFIG_WIFI_BROADCOM_COB */ -#if defined(CONFIG_MACH_SAMSUNG_ESPRESSO)\ - || defined(CONFIG_MACH_SAMSUNG_ESPRESSO_10) + +/***** PROJECTS START ******/ + +#if defined(CONFIG_MACH_SAMSUNG_ESPRESSO) || defined(CONFIG_MACH_SAMSUNG_ESPRESSO_10) #define READ_MACADDR #define HW_OOB #endif /* CONFIG_MACH_SAMSUNG_ESPRESSO && CONFIG_MACH_SAMSUNG_ESPRESSO_10 */ @@ -49,17 +87,6 @@ #define READ_MACADDR #endif /* CONFIG_ARCH_MSM7X30 */ -#if defined(CONFIG_MACH_GC1) || defined(CONFIG_MACH_U1_NA_SPR) || \ - defined(CONFIG_MACH_VIENNAEUR) || defined(CONFIG_MACH_LT03EUR) || \ - defined(CONFIG_MACH_LT03SKT) || defined(CONFIG_MACH_LT03KTT) || \ - defined(CONFIG_MACH_LT03LGT) -#undef USE_CID_CHECK -#define READ_MACADDR -#endif /* CONFIG_MACH_GC1 || CONFIG_MACH_U1_NA_SPR || CONFIG_MACH_VIENNAEUR || - * CONFIG_MACH_LT03EUR || CONFIG_MACH_LT03SKT || CONFIG_MACH_LT03KTT || - * CONFIG_MACH_LT03LGT - */ - #ifdef CONFIG_MACH_P10 #define READ_MACADDR #endif /* CONFIG_MACH_P10 */ @@ -73,7 +100,8 @@ #define POWERUP_MAX_RETRY 5 /* Due to late start-up of FPGA in JF project */ #endif /* CONFIG_BCM4335 || CONFIG_BCM4335_MODULE */ -/* REGION CODE */ +/* REGION CODE START */ + #ifndef CONFIG_WLAN_REGION_CODE #define CONFIG_WLAN_REGION_CODE 100 #endif /* CONFIG_WLAN_REGION_CODE */ @@ -140,18 +168,24 @@ #endif /* CONFIG_WLAN_REGION_CODE >= 200 && CONFIG_WLAN_REGION_CODE < 300 */ #if (CONFIG_WLAN_REGION_CODE >= 300) && (CONFIG_WLAN_REGION_CODE < 400) /* CHN */ -#ifndef BCMWAPI_WPI #define BCMWAPI_WPI -#endif -#ifndef BCMWAPI_WAI #define BCMWAPI_WAI -#endif #endif /* CONFIG_WLAN_REGION_CODE >= 300 && CONFIG_WLAN_REGION_CODE < 400 */ -#if !defined(READ_MACADDR) && !defined(WRITE_MACADDR) \ - && !defined(RDWR_KORICS_MACADDR) && !defined(RDWR_MACADDR) +#if (CONFIG_WLAN_REGION_CODE == 402) /* TMO */ +#undef CUSTOM_SUSPEND_BCN_LI_DTIM +#define CUSTOM_SUSPEND_BCN_LI_DTIM 3 +#endif /* CONFIG_WLAN_REGION_CODE == 402 */ + +/* REGION CODE END */ + + +#if !defined(READ_MACADDR) && !defined(WRITE_MACADDR) && !defined(RDWR_KORICS_MACADDR) \ + && !defined(RDWR_MACADDR) #define GET_MAC_FROM_OTP #define SHOW_NVRAM_TYPE #endif /* !READ_MACADDR && !WRITE_MACADDR && !RDWR_KORICS_MACADDR && !RDWR_MACADDR */ -#endif /* _dhd_sec_feature_h_ */ +#define WRITE_WLANINFO + +#endif /* _dhd_sec_feature_h_ */ \ No newline at end of file diff --git a/drivers/net/wireless/bcmdhd/dhd_wlfc.c b/drivers/net/wireless/bcmdhd/dhd_wlfc.c new file mode 100644 index 00000000000..191ed30670b --- /dev/null +++ b/drivers/net/wireless/bcmdhd/dhd_wlfc.c @@ -0,0 +1,2502 @@ +/* + * DHD PROP_TXSTATUS Module. + * + * Copyright (C) 1999-2013, Broadcom Corporation + * + * Unless you and Broadcom execute a separate written software license + * agreement governing use of this software, this software is licensed to you + * under the terms of the GNU General Public License version 2 (the "GPL"), + * available at http://www.broadcom.com/licenses/GPLv2.php, with the + * following added to such license: + * + * As a special exception, the copyright holders of this software give you + * permission to link this software with independent modules, and to copy and + * distribute the resulting executable under terms of your choice, provided that + * you also meet, for each linked independent module, the terms and conditions of + * the license of that module. An independent module is a module which is not + * derived from this software. The special exception does not apply to any + * modifications of the software. + * + * Notwithstanding the above, under no circumstances may you combine this + * software in any way with any other Broadcom software provided under a license + * other than the GPL, without Broadcom's express prior written consent. + * + * $Id: dhd_wlfc.c 444108 2013-12-18 17:39:51Z $ + * + */ + +#include +#include + +#include +#include + +#include +#include + +#include +#include + +#ifdef PROP_TXSTATUS +#include +#include +#endif + + + + +#define BUS_RETRIES 1 /* # of retries before aborting a bus tx operation */ + +#ifdef PROP_TXSTATUS +typedef struct dhd_wlfc_commit_info { + uint8 needs_hdr; + uint8 ac_fifo_credit_spent; + ewlfc_packet_state_t pkt_type; + wlfc_mac_descriptor_t* mac_entry; + void* p; +} dhd_wlfc_commit_info_t; +#endif /* PROP_TXSTATUS */ + + +#ifdef PROP_TXSTATUS + +#define DHD_WLFC_QMON_COMPLETE(entry) + +void +dhd_wlfc_dump(dhd_pub_t *dhdp, struct bcmstrbuf *strbuf) +{ + int i; + uint8* ea; + athost_wl_status_info_t* wlfc = (athost_wl_status_info_t*) + dhdp->wlfc_state; + wlfc_hanger_t* h; + wlfc_mac_descriptor_t* mac_table; + wlfc_mac_descriptor_t* interfaces; + char* iftypes[] = {"STA", "AP", "WDS", "p2pGO", "p2pCL"}; + + if (wlfc == NULL) { + bcm_bprintf(strbuf, "wlfc not initialized yet\n"); + return; + } + h = (wlfc_hanger_t*)wlfc->hanger; + if (h == NULL) { + bcm_bprintf(strbuf, "wlfc-hanger not initialized yet\n"); + } + + mac_table = wlfc->destination_entries.nodes; + interfaces = wlfc->destination_entries.interfaces; + bcm_bprintf(strbuf, "---- wlfc stats ----\n"); + if (h) { + bcm_bprintf(strbuf, "wlfc hanger (pushed,popped,f_push," + "f_pop,f_slot, pending) = (%d,%d,%d,%d,%d,%d)\n", + h->pushed, + h->popped, + h->failed_to_push, + h->failed_to_pop, + h->failed_slotfind, + (h->pushed - h->popped)); + } + + bcm_bprintf(strbuf, "wlfc fail(tlv,credit_rqst,mac_update,psmode_update), " + "(dq_full,rollback_fail) = (%d,%d,%d,%d), (%d,%d)\n", + wlfc->stats.tlv_parse_failed, + wlfc->stats.credit_request_failed, + wlfc->stats.mac_update_failed, + wlfc->stats.psmode_update_failed, + wlfc->stats.delayq_full_error, + wlfc->stats.rollback_failed); + + bcm_bprintf(strbuf, "PKTS (credit,sent) " + "(AC0[%d,%d],AC1[%d,%d],AC2[%d,%d],AC3[%d,%d],BC_MC[%d,%d])\n", + wlfc->FIFO_credit[0], wlfc->stats.send_pkts[0], + wlfc->FIFO_credit[1], wlfc->stats.send_pkts[1], + wlfc->FIFO_credit[2], wlfc->stats.send_pkts[2], + wlfc->FIFO_credit[3], wlfc->stats.send_pkts[3], + wlfc->FIFO_credit[4], wlfc->stats.send_pkts[4]); + + bcm_bprintf(strbuf, "\n"); + for (i = 0; i < WLFC_MAX_IFNUM; i++) { + if (interfaces[i].occupied) { + char* iftype_desc; + + if (interfaces[i].iftype > WLC_E_IF_ROLE_P2P_CLIENT) + iftype_desc = "hostif_flow_state[i] == OFF) + ? " OFF":" ON")); + + bcm_bprintf(strbuf, "INTERFACE[%d].DELAYQ(len,state,credit)" + "= (%d,%s,%d)\n", + i, + interfaces[i].psq.len, + ((interfaces[i].state == + WLFC_STATE_OPEN) ? " OPEN":"CLOSE"), + interfaces[i].requested_credit); + + bcm_bprintf(strbuf, "INTERFACE[%d].DELAYQ" + "(sup,ac0),(sup,ac1),(sup,ac2),(sup,ac3) = " + "(%d,%d),(%d,%d),(%d,%d),(%d,%d)\n", + i, + interfaces[i].psq.q[0].len, + interfaces[i].psq.q[1].len, + interfaces[i].psq.q[2].len, + interfaces[i].psq.q[3].len, + interfaces[i].psq.q[4].len, + interfaces[i].psq.q[5].len, + interfaces[i].psq.q[6].len, + interfaces[i].psq.q[7].len); + } + } + + bcm_bprintf(strbuf, "\n"); + for (i = 0; i < WLFC_MAC_DESC_TABLE_SIZE; i++) { + if (mac_table[i].occupied) { + ea = mac_table[i].ea; + bcm_bprintf(strbuf, "MAC_table[%d].ea = " + "[%02x:%02x:%02x:%02x:%02x:%02x], if:%d \n", i, + ea[0], ea[1], ea[2], ea[3], ea[4], ea[5], + mac_table[i].interface_id); + + bcm_bprintf(strbuf, "MAC_table[%d].DELAYQ(len,state,credit)" + "= (%d,%s,%d)\n", + i, + mac_table[i].psq.len, + ((mac_table[i].state == + WLFC_STATE_OPEN) ? " OPEN":"CLOSE"), + mac_table[i].requested_credit); +#ifdef PROP_TXSTATUS_DEBUG + bcm_bprintf(strbuf, "MAC_table[%d]: (opened, closed) = (%d, %d)\n", + i, mac_table[i].opened_ct, mac_table[i].closed_ct); +#endif + bcm_bprintf(strbuf, "MAC_table[%d].DELAYQ" + "(sup,ac0),(sup,ac1),(sup,ac2),(sup,ac3) = " + "(%d,%d),(%d,%d),(%d,%d),(%d,%d)\n", + i, + mac_table[i].psq.q[0].len, + mac_table[i].psq.q[1].len, + mac_table[i].psq.q[2].len, + mac_table[i].psq.q[3].len, + mac_table[i].psq.q[4].len, + mac_table[i].psq.q[5].len, + mac_table[i].psq.q[6].len, + mac_table[i].psq.q[7].len); + } + } + +#ifdef PROP_TXSTATUS_DEBUG + { + int avg; + int moving_avg = 0; + int moving_samples; + + if (wlfc->stats.latency_sample_count) { + moving_samples = sizeof(wlfc->stats.deltas)/sizeof(uint32); + + for (i = 0; i < moving_samples; i++) + moving_avg += wlfc->stats.deltas[i]; + moving_avg /= moving_samples; + + avg = (100 * wlfc->stats.total_status_latency) / + wlfc->stats.latency_sample_count; + bcm_bprintf(strbuf, "txstatus latency (average, last, moving[%d]) = " + "(%d.%d, %03d, %03d)\n", + moving_samples, avg/100, (avg - (avg/100)*100), + wlfc->stats.latency_most_recent, + moving_avg); + } + } + + bcm_bprintf(strbuf, "wlfc- fifo[0-5] credit stats: sent = (%d,%d,%d,%d,%d,%d), " + "back = (%d,%d,%d,%d,%d,%d)\n", + wlfc->stats.fifo_credits_sent[0], + wlfc->stats.fifo_credits_sent[1], + wlfc->stats.fifo_credits_sent[2], + wlfc->stats.fifo_credits_sent[3], + wlfc->stats.fifo_credits_sent[4], + wlfc->stats.fifo_credits_sent[5], + + wlfc->stats.fifo_credits_back[0], + wlfc->stats.fifo_credits_back[1], + wlfc->stats.fifo_credits_back[2], + wlfc->stats.fifo_credits_back[3], + wlfc->stats.fifo_credits_back[4], + wlfc->stats.fifo_credits_back[5]); + { + uint32 fifo_cr_sent = 0; + uint32 fifo_cr_acked = 0; + uint32 request_cr_sent = 0; + uint32 request_cr_ack = 0; + uint32 bc_mc_cr_ack = 0; + + for (i = 0; i < sizeof(wlfc->stats.fifo_credits_sent)/sizeof(uint32); i++) { + fifo_cr_sent += wlfc->stats.fifo_credits_sent[i]; + } + + for (i = 0; i < sizeof(wlfc->stats.fifo_credits_back)/sizeof(uint32); i++) { + fifo_cr_acked += wlfc->stats.fifo_credits_back[i]; + } + + for (i = 0; i < WLFC_MAC_DESC_TABLE_SIZE; i++) { + if (wlfc->destination_entries.nodes[i].occupied) { + request_cr_sent += + wlfc->destination_entries.nodes[i].dstncredit_sent_packets; + } + } + for (i = 0; i < WLFC_MAX_IFNUM; i++) { + if (wlfc->destination_entries.interfaces[i].occupied) { + request_cr_sent += + wlfc->destination_entries.interfaces[i].dstncredit_sent_packets; + } + } + for (i = 0; i < WLFC_MAC_DESC_TABLE_SIZE; i++) { + if (wlfc->destination_entries.nodes[i].occupied) { + request_cr_ack += + wlfc->destination_entries.nodes[i].dstncredit_acks; + } + } + for (i = 0; i < WLFC_MAX_IFNUM; i++) { + if (wlfc->destination_entries.interfaces[i].occupied) { + request_cr_ack += + wlfc->destination_entries.interfaces[i].dstncredit_acks; + } + } + bcm_bprintf(strbuf, "wlfc- (sent, status) => pq(%d,%d), vq(%d,%d)," + "other:%d, bc_mc:%d, signal-only, (sent,freed): (%d,%d)", + fifo_cr_sent, fifo_cr_acked, + request_cr_sent, request_cr_ack, + wlfc->destination_entries.other.dstncredit_acks, + bc_mc_cr_ack, + wlfc->stats.signal_only_pkts_sent, wlfc->stats.signal_only_pkts_freed); + } +#endif /* PROP_TXSTATUS_DEBUG */ + bcm_bprintf(strbuf, "\n"); + bcm_bprintf(strbuf, "wlfc- pkt((in,2bus,txstats,hdrpull),(dropped,hdr_only,wlc_tossed)" + "(freed,free_err,rollback)) = " + "((%d,%d,%d,%d),(%d,%d,%d),(%d,%d,%d))\n", + wlfc->stats.pktin, + wlfc->stats.pkt2bus, + wlfc->stats.txstatus_in, + wlfc->stats.dhd_hdrpulls, + + wlfc->stats.pktdropped, + wlfc->stats.wlfc_header_only_pkt, + wlfc->stats.wlc_tossed_pkts, + + wlfc->stats.pkt_freed, + wlfc->stats.pkt_free_err, wlfc->stats.rollback); + + bcm_bprintf(strbuf, "wlfc- suppress((d11,wlc,err),enq(d11,wl,hq,mac?),retx(d11,wlc,hq)) = " + "((%d,%d,%d),(%d,%d,%d,%d),(%d,%d,%d))\n", + + wlfc->stats.d11_suppress, + wlfc->stats.wl_suppress, + wlfc->stats.bad_suppress, + + wlfc->stats.psq_d11sup_enq, + wlfc->stats.psq_wlsup_enq, + wlfc->stats.psq_hostq_enq, + wlfc->stats.mac_handle_notfound, + + wlfc->stats.psq_d11sup_retx, + wlfc->stats.psq_wlsup_retx, + wlfc->stats.psq_hostq_retx); + bcm_bprintf(strbuf, "wlfc- generic error: %d", wlfc->stats.generic_error); + + return; +} + +/* Create a place to store all packet pointers submitted to the firmware until + a status comes back, suppress or otherwise. + + hang-er: noun, a contrivance on which things are hung, as a hook. +*/ +static void* +dhd_wlfc_hanger_create(osl_t *osh, int max_items) +{ + int i; + wlfc_hanger_t* hanger; + + /* allow only up to a specific size for now */ + ASSERT(max_items == WLFC_HANGER_MAXITEMS); + + if ((hanger = (wlfc_hanger_t*)MALLOC(osh, WLFC_HANGER_SIZE(max_items))) == NULL) + return NULL; + + memset(hanger, 0, WLFC_HANGER_SIZE(max_items)); + hanger->max_items = max_items; + + for (i = 0; i < hanger->max_items; i++) { + hanger->items[i].state = WLFC_HANGER_ITEM_STATE_FREE; + } + return hanger; +} + +static int +dhd_wlfc_hanger_delete(osl_t *osh, void* hanger) +{ + wlfc_hanger_t* h = (wlfc_hanger_t*)hanger; + + if (h) { + MFREE(osh, h, WLFC_HANGER_SIZE(h->max_items)); + return BCME_OK; + } + return BCME_BADARG; +} + +static uint16 +dhd_wlfc_hanger_get_free_slot(void* hanger) +{ + uint32 i; + wlfc_hanger_t* h = (wlfc_hanger_t*)hanger; + + if (h) { + i = h->slot_pos + 1; + if (i == h->max_items) { + i = 0; + } + while (i != h->slot_pos) { + if (h->items[i].state == WLFC_HANGER_ITEM_STATE_FREE) { + h->slot_pos = i; + return (uint16)i; + } + i++; + if (i == h->max_items) + i = 0; + } + h->failed_slotfind++; + } + return WLFC_HANGER_MAXITEMS; +} + +static int +dhd_wlfc_hanger_get_genbit(void* hanger, void* pkt, uint32 slot_id, int* gen) +{ + int rc = BCME_OK; + wlfc_hanger_t* h = (wlfc_hanger_t*)hanger; + + *gen = 0xff; + + /* this packet was not pushed at the time it went to the firmware */ + if (slot_id == WLFC_HANGER_MAXITEMS) + return BCME_NOTFOUND; + + if (h) { + if ((h->items[slot_id].state == WLFC_HANGER_ITEM_STATE_INUSE) || + (h->items[slot_id].state == WLFC_HANGER_ITEM_STATE_INUSE_SUPPRESSED)) { + *gen = h->items[slot_id].gen; + } + else { + rc = BCME_NOTFOUND; + } + } + else + rc = BCME_BADARG; + return rc; +} + +static int +dhd_wlfc_hanger_pushpkt(void* hanger, void* pkt, uint32 slot_id) +{ + int rc = BCME_OK; + wlfc_hanger_t* h = (wlfc_hanger_t*)hanger; + + if (h && (slot_id < WLFC_HANGER_MAXITEMS)) { + if (h->items[slot_id].state == WLFC_HANGER_ITEM_STATE_FREE) { + h->items[slot_id].state = WLFC_HANGER_ITEM_STATE_INUSE; + h->items[slot_id].pkt = pkt; + h->items[slot_id].identifier = slot_id; + h->pushed++; + } + else { + h->failed_to_push++; + rc = BCME_NOTFOUND; + } + } + else + rc = BCME_BADARG; + return rc; +} + +static int +dhd_wlfc_hanger_poppkt(void* hanger, uint32 slot_id, void** pktout, int remove_from_hanger) +{ + int rc = BCME_OK; + wlfc_hanger_t* h = (wlfc_hanger_t*)hanger; + + /* this packet was not pushed at the time it went to the firmware */ + if (slot_id == WLFC_HANGER_MAXITEMS) + return BCME_NOTFOUND; + + if (h) { + if (h->items[slot_id].state != WLFC_HANGER_ITEM_STATE_FREE) { + *pktout = h->items[slot_id].pkt; + if (remove_from_hanger) { + h->items[slot_id].state = + WLFC_HANGER_ITEM_STATE_FREE; + h->items[slot_id].pkt = NULL; + h->items[slot_id].identifier = 0; + h->items[slot_id].gen = 0xff; + h->popped++; + } + } + else { + h->failed_to_pop++; + rc = BCME_NOTFOUND; + } + } + else + rc = BCME_BADARG; + return rc; +} + +static int +dhd_wlfc_hanger_mark_suppressed(void* hanger, uint32 slot_id, uint8 gen) +{ + int rc = BCME_OK; + wlfc_hanger_t* h = (wlfc_hanger_t*)hanger; + + /* this packet was not pushed at the time it went to the firmware */ + if (slot_id == WLFC_HANGER_MAXITEMS) + return BCME_NOTFOUND; + if (h) { + h->items[slot_id].gen = gen; + if (h->items[slot_id].state == WLFC_HANGER_ITEM_STATE_INUSE) { + h->items[slot_id].state = WLFC_HANGER_ITEM_STATE_INUSE_SUPPRESSED; + } + else + rc = BCME_BADARG; + } + else + rc = BCME_BADARG; + + return rc; +} + +static int +_dhd_wlfc_pushheader(athost_wl_status_info_t* ctx, void* p, bool tim_signal, + uint8 tim_bmp, uint8 mac_handle, uint32 htodtag) +{ + uint32 wl_pktinfo = 0; + uint8* wlh; + uint8 dataOffset; + uint8 fillers; + uint8 tim_signal_len = 0; + + struct bdc_header *h; + + if (tim_signal) { + tim_signal_len = 1 + 1 + WLFC_CTL_VALUE_LEN_PENDING_TRAFFIC_BMP; + } + + /* +2 is for Type[1] and Len[1] in TLV, plus TIM signal */ + dataOffset = WLFC_CTL_VALUE_LEN_PKTTAG + 2 + tim_signal_len; + fillers = ROUNDUP(dataOffset, 4) - dataOffset; + dataOffset += fillers; + + PKTPUSH(ctx->osh, p, dataOffset); + wlh = (uint8*) PKTDATA(ctx->osh, p); + + wl_pktinfo = htol32(htodtag); + + wlh[0] = WLFC_CTL_TYPE_PKTTAG; + wlh[1] = WLFC_CTL_VALUE_LEN_PKTTAG; + memcpy(&wlh[2], &wl_pktinfo, sizeof(uint32)); + + if (tim_signal_len) { + wlh[dataOffset - fillers - tim_signal_len ] = + WLFC_CTL_TYPE_PENDING_TRAFFIC_BMP; + wlh[dataOffset - fillers - tim_signal_len + 1] = + WLFC_CTL_VALUE_LEN_PENDING_TRAFFIC_BMP; + wlh[dataOffset - fillers - tim_signal_len + 2] = mac_handle; + wlh[dataOffset - fillers - tim_signal_len + 3] = tim_bmp; + } + if (fillers) + memset(&wlh[dataOffset - fillers], WLFC_CTL_TYPE_FILLER, fillers); + + PKTPUSH(ctx->osh, p, BDC_HEADER_LEN); + h = (struct bdc_header *)PKTDATA(ctx->osh, p); + h->flags = (BDC_PROTO_VER << BDC_FLAG_VER_SHIFT); + if (PKTSUMNEEDED(p)) + h->flags |= BDC_FLAG_SUM_NEEDED; + + + h->priority = (PKTPRIO(p) & BDC_PRIORITY_MASK); + h->flags2 = 0; + h->dataOffset = dataOffset >> 2; + BDC_SET_IF_IDX(h, DHD_PKTTAG_IF(PKTTAG(p))); + return BCME_OK; +} + +static int +_dhd_wlfc_pullheader(athost_wl_status_info_t* ctx, void* pktbuf) +{ + struct bdc_header *h; + + if (PKTLEN(ctx->osh, pktbuf) < BDC_HEADER_LEN) { + WLFC_DBGMESG(("%s: rx data too short (%d < %d)\n", __FUNCTION__, + PKTLEN(ctx->osh, pktbuf), BDC_HEADER_LEN)); + return BCME_ERROR; + } + h = (struct bdc_header *)PKTDATA(ctx->osh, pktbuf); + + /* pull BDC header */ + PKTPULL(ctx->osh, pktbuf, BDC_HEADER_LEN); + + if (PKTLEN(ctx->osh, pktbuf) < (h->dataOffset << 2)) { + WLFC_DBGMESG(("%s: rx data too short (%d < %d)\n", __FUNCTION__, + PKTLEN(ctx->osh, pktbuf), (h->dataOffset << 2))); + return BCME_ERROR; + } + + /* pull wl-header */ + PKTPULL(ctx->osh, pktbuf, (h->dataOffset << 2)); + return BCME_OK; +} + +static wlfc_mac_descriptor_t* +_dhd_wlfc_find_table_entry(athost_wl_status_info_t* ctx, void* p) +{ + int i; + wlfc_mac_descriptor_t* table = ctx->destination_entries.nodes; + uint8 ifid = DHD_PKTTAG_IF(PKTTAG(p)); + uint8* dstn = DHD_PKTTAG_DSTN(PKTTAG(p)); + wlfc_mac_descriptor_t* entry = NULL; + int iftype = ctx->destination_entries.interfaces[ifid].iftype; + + /* Multicast destination and P2P clients get the interface entry. + * STA gets the interface entry if there is no exact match. For + * example, TDLS destinations have their own entry. + */ + if ((iftype == WLC_E_IF_ROLE_STA || ETHER_ISMULTI(dstn) || + iftype == WLC_E_IF_ROLE_P2P_CLIENT) && + (ctx->destination_entries.interfaces[ifid].occupied)) { + entry = &ctx->destination_entries.interfaces[ifid]; + } + + if (entry != NULL && ETHER_ISMULTI(dstn)) + return entry; + + for (i = 0; i < WLFC_MAC_DESC_TABLE_SIZE; i++) { + if (table[i].occupied) { + if (table[i].interface_id == ifid) { + if (!memcmp(table[i].ea, dstn, ETHER_ADDR_LEN)) { + entry = &table[i]; + break; + } + } + } + } + + return entry != NULL ? entry : &ctx->destination_entries.other; +} + +static int +_dhd_wlfc_rollback_packet_toq(athost_wl_status_info_t* ctx, + void* p, ewlfc_packet_state_t pkt_type, uint32 hslot) +{ + /* + put the packet back to the head of queue + + - suppressed packet goes back to suppress sub-queue + - pull out the header, if new or delayed packet + + Note: hslot is used only when header removal is done. + */ + wlfc_mac_descriptor_t* entry; + void* pktout; + int rc = BCME_OK; + int prec; + + entry = _dhd_wlfc_find_table_entry(ctx, p); + prec = DHD_PKTTAG_FIFO(PKTTAG(p)); + if (entry != NULL) { + if (pkt_type == eWLFC_PKTTYPE_SUPPRESSED) { + /* wl-header is saved for suppressed packets */ + if (WLFC_PKTQ_PENQ_HEAD(&entry->psq, ((prec << 1) + 1), p) == NULL) { + WLFC_DBGMESG(("Error: %s():%d\n", __FUNCTION__, __LINE__)); + rc = BCME_ERROR; + } + } + else { + /* remove header first */ + rc = _dhd_wlfc_pullheader(ctx, p); + if (rc != BCME_OK) { + WLFC_DBGMESG(("Error: %s():%d\n", __FUNCTION__, __LINE__)); + /* free the hanger slot */ + dhd_wlfc_hanger_poppkt(ctx->hanger, hslot, &pktout, 1); + PKTFREE(ctx->osh, p, TRUE); + ctx->stats.rollback_failed++; + return BCME_ERROR; + } + + if (pkt_type == eWLFC_PKTTYPE_DELAYED) { + /* delay-q packets are going to delay-q */ + if (WLFC_PKTQ_PENQ_HEAD(&entry->psq, (prec << 1), p) == NULL) { + WLFC_DBGMESG(("Error: %s():%d\n", __FUNCTION__, __LINE__)); + rc = BCME_ERROR; + } + } + + /* free the hanger slot */ + dhd_wlfc_hanger_poppkt(ctx->hanger, hslot, &pktout, 1); + + /* decrement sequence count */ + WLFC_DECR_SEQCOUNT(entry, prec); + } + /* + if this packet did not count against FIFO credit, it must have + taken a requested_credit from the firmware (for pspoll etc.) + */ + if (!DHD_PKTTAG_CREDITCHECK(PKTTAG(p))) { + entry->requested_credit++; + } + } + else { + WLFC_DBGMESG(("Error: %s():%d\n", __FUNCTION__, __LINE__)); + rc = BCME_ERROR; + } + if (rc != BCME_OK) + ctx->stats.rollback_failed++; + else + ctx->stats.rollback++; + + return rc; +} + +static void +_dhd_wlfc_flow_control_check(athost_wl_status_info_t* ctx, struct pktq* pq, uint8 if_id) +{ + dhd_pub_t *dhdp; + + ASSERT(ctx); + + dhdp = (dhd_pub_t *)ctx->dhdp; + + if (dhdp && dhdp->skip_fc && dhdp->skip_fc()) + return; + + if ((pq->len <= WLFC_FLOWCONTROL_LOWATER) && (ctx->hostif_flow_state[if_id] == ON)) { + /* start traffic */ + ctx->hostif_flow_state[if_id] = OFF; + /* + WLFC_DBGMESG(("qlen:%02d, if:%02d, ->OFF, start traffic %s()\n", + pq->len, if_id, __FUNCTION__)); + */ + WLFC_DBGMESG(("F")); + + dhd_txflowcontrol(ctx->dhdp, if_id, OFF); + + ctx->toggle_host_if = 0; + } + if ((pq->len >= WLFC_FLOWCONTROL_HIWATER) && (ctx->hostif_flow_state[if_id] == OFF)) { + /* stop traffic */ + ctx->hostif_flow_state[if_id] = ON; + /* + WLFC_DBGMESG(("qlen:%02d, if:%02d, ->ON, stop traffic %s()\n", + pq->len, if_id, __FUNCTION__)); + */ + WLFC_DBGMESG(("N")); + + dhd_txflowcontrol(ctx->dhdp, if_id, ON); + + ctx->host_ifidx = if_id; + ctx->toggle_host_if = 1; + } + + return; +} + +static int +_dhd_wlfc_send_signalonly_packet(athost_wl_status_info_t* ctx, wlfc_mac_descriptor_t* entry, + uint8 ta_bmp) +{ + int rc = BCME_OK; + void* p = NULL; + int dummylen = ((dhd_pub_t *)ctx->dhdp)->hdrlen+ 12; + + /* allocate a dummy packet */ + p = PKTGET(ctx->osh, dummylen, TRUE); + if (p) { + PKTPULL(ctx->osh, p, dummylen); + DHD_PKTTAG_SET_H2DTAG(PKTTAG(p), 0); + _dhd_wlfc_pushheader(ctx, p, TRUE, ta_bmp, entry->mac_handle, 0); + DHD_PKTTAG_SETSIGNALONLY(PKTTAG(p), 1); +#ifdef PROP_TXSTATUS_DEBUG + ctx->stats.signal_only_pkts_sent++; +#endif + rc = dhd_bus_txdata(((dhd_pub_t *)ctx->dhdp)->bus, p); + if (rc != BCME_OK) { + PKTFREE(ctx->osh, p, TRUE); + } + } + else { + DHD_ERROR(("%s: couldn't allocate new %d-byte packet\n", + __FUNCTION__, dummylen)); + rc = BCME_NOMEM; + } + return rc; +} + +/* Return TRUE if traffic availability changed */ +static bool +_dhd_wlfc_traffic_pending_check(athost_wl_status_info_t* ctx, wlfc_mac_descriptor_t* entry, + int prec) +{ + bool rc = FALSE; + + if (entry->state == WLFC_STATE_CLOSE) { + if ((pktq_plen(&entry->psq, (prec << 1)) == 0) && + (pktq_plen(&entry->psq, ((prec << 1) + 1)) == 0)) { + + if (entry->traffic_pending_bmp & NBITVAL(prec)) { + rc = TRUE; + entry->traffic_pending_bmp = + entry->traffic_pending_bmp & ~ NBITVAL(prec); + } + } + else { + if (!(entry->traffic_pending_bmp & NBITVAL(prec))) { + rc = TRUE; + entry->traffic_pending_bmp = + entry->traffic_pending_bmp | NBITVAL(prec); + } + } + } + if (rc) { + /* request a TIM update to firmware at the next piggyback opportunity */ + if (entry->traffic_lastreported_bmp != entry->traffic_pending_bmp) { + entry->send_tim_signal = 1; + _dhd_wlfc_send_signalonly_packet(ctx, entry, entry->traffic_pending_bmp); + entry->traffic_lastreported_bmp = entry->traffic_pending_bmp; + entry->send_tim_signal = 0; + } + else { + rc = FALSE; + } + } + return rc; +} + +static int +_dhd_wlfc_enque_suppressed(athost_wl_status_info_t* ctx, int prec, void* p) +{ + wlfc_mac_descriptor_t* entry; + + entry = _dhd_wlfc_find_table_entry(ctx, p); + if (entry == NULL) { + WLFC_DBGMESG(("Error: %s():%d\n", __FUNCTION__, __LINE__)); + return BCME_NOTFOUND; + } + /* + - suppressed packets go to sub_queue[2*prec + 1] AND + - delayed packets go to sub_queue[2*prec + 0] to ensure + order of delivery. + */ + if (WLFC_PKTQ_PENQ(&entry->psq, ((prec << 1) + 1), p) == NULL) { + ctx->stats.delayq_full_error++; + /* WLFC_DBGMESG(("Error: %s():%d\n", __FUNCTION__, __LINE__)); */ + WLFC_DBGMESG(("s")); + return BCME_ERROR; + } + /* A packet has been pushed, update traffic availability bitmap, if applicable */ + _dhd_wlfc_traffic_pending_check(ctx, entry, prec); + _dhd_wlfc_flow_control_check(ctx, &entry->psq, DHD_PKTTAG_IF(PKTTAG(p))); + return BCME_OK; +} + +static int +_dhd_wlfc_pretx_pktprocess(athost_wl_status_info_t* ctx, + wlfc_mac_descriptor_t* entry, void* p, int header_needed, uint32* slot) +{ + int rc = BCME_OK; + int hslot = WLFC_HANGER_MAXITEMS; + bool send_tim_update = FALSE; + uint32 htod = 0; + uint8 free_ctr; + + *slot = hslot; + + if (entry == NULL) { + entry = _dhd_wlfc_find_table_entry(ctx, p); + } + + if (entry == NULL) { + WLFC_DBGMESG(("Error: %s():%d\n", __FUNCTION__, __LINE__)); + return BCME_ERROR; + } + if (entry->send_tim_signal) { + send_tim_update = TRUE; + entry->send_tim_signal = 0; + entry->traffic_lastreported_bmp = entry->traffic_pending_bmp; + } + if (header_needed) { + hslot = dhd_wlfc_hanger_get_free_slot(ctx->hanger); + free_ctr = WLFC_SEQCOUNT(entry, DHD_PKTTAG_FIFO(PKTTAG(p))); + DHD_PKTTAG_SET_H2DTAG(PKTTAG(p), htod); + WLFC_PKTFLAG_SET_GENERATION(htod, entry->generation); + entry->transit_count++; + } + else { + hslot = WLFC_PKTID_HSLOT_GET(DHD_PKTTAG_H2DTAG(PKTTAG(p))); + free_ctr = WLFC_PKTID_FREERUNCTR_GET(DHD_PKTTAG_H2DTAG(PKTTAG(p))); + } + WLFC_PKTID_HSLOT_SET(htod, hslot); + WLFC_PKTID_FREERUNCTR_SET(htod, free_ctr); + DHD_PKTTAG_SETPKTDIR(PKTTAG(p), 1); + WL_TXSTATUS_SET_FLAGS(htod, WLFC_PKTFLAG_PKTFROMHOST); + WL_TXSTATUS_SET_FIFO(htod, DHD_PKTTAG_FIFO(PKTTAG(p))); + + + if (!DHD_PKTTAG_CREDITCHECK(PKTTAG(p))) { + /* + Indicate that this packet is being sent in response to an + explicit request from the firmware side. + */ + WLFC_PKTFLAG_SET_PKTREQUESTED(htod); + } + else { + WLFC_PKTFLAG_CLR_PKTREQUESTED(htod); + } + if (header_needed) { + rc = _dhd_wlfc_pushheader(ctx, p, send_tim_update, + entry->traffic_lastreported_bmp, entry->mac_handle, htod); + if (rc == BCME_OK) { + DHD_PKTTAG_SET_H2DTAG(PKTTAG(p), htod); + /* + a new header was created for this packet. + push to hanger slot and scrub q. Since bus + send succeeded, increment seq number as well. + */ + rc = dhd_wlfc_hanger_pushpkt(ctx->hanger, p, hslot); + if (rc == BCME_OK) { + /* increment free running sequence count */ + WLFC_INCR_SEQCOUNT(entry, DHD_PKTTAG_FIFO(PKTTAG(p))); +#ifdef PROP_TXSTATUS_DEBUG + ((wlfc_hanger_t*)(ctx->hanger))->items[hslot].push_time = + OSL_SYSUPTIME(); +#endif + } + else { + WLFC_DBGMESG(("%s() hanger_pushpkt() failed, rc: %d\n", + __FUNCTION__, rc)); + } + } + } + else { + int gen; + + /* remove old header */ + rc = _dhd_wlfc_pullheader(ctx, p); + if (rc == BCME_OK) { + hslot = WLFC_PKTID_HSLOT_GET(DHD_PKTTAG_H2DTAG(PKTTAG(p))); + dhd_wlfc_hanger_get_genbit(ctx->hanger, p, hslot, &gen); + + WLFC_PKTFLAG_SET_GENERATION(htod, gen); + free_ctr = WLFC_PKTID_FREERUNCTR_GET(DHD_PKTTAG_H2DTAG(PKTTAG(p))); + /* push new header */ + _dhd_wlfc_pushheader(ctx, p, send_tim_update, + entry->traffic_lastreported_bmp, entry->mac_handle, htod); + } + } + *slot = hslot; + return rc; +} + +static int +_dhd_wlfc_is_destination_closed(athost_wl_status_info_t* ctx, + wlfc_mac_descriptor_t* entry, int prec) +{ + if (ctx->destination_entries.interfaces[entry->interface_id].iftype == + WLC_E_IF_ROLE_P2P_GO) { + /* - destination interface is of type p2p GO. + For a p2pGO interface, if the destination is OPEN but the interface is + CLOSEd, do not send traffic. But if the dstn is CLOSEd while there is + destination-specific-credit left send packets. This is because the + firmware storing the destination-specific-requested packet in queue. + */ + if ((entry->state == WLFC_STATE_CLOSE) && (entry->requested_credit == 0) && + (entry->requested_packet == 0)) + return 1; + } + /* AP, p2p_go -> unicast desc entry, STA/p2p_cl -> interface desc. entry */ + if (((entry->state == WLFC_STATE_CLOSE) && (entry->requested_credit == 0) && + (entry->requested_packet == 0)) || + (!(entry->ac_bitmap & (1 << prec)))) + return 1; + + return 0; +} + +static void* +_dhd_wlfc_deque_delayedq(athost_wl_status_info_t* ctx, + int prec, uint8* ac_credit_spent, uint8* needs_hdr, wlfc_mac_descriptor_t** entry_out) +{ + wlfc_mac_descriptor_t* entry; + wlfc_mac_descriptor_t* table; + uint8 token_pos; + int total_entries; + void* p = NULL; + int pout; + int i; + + *entry_out = NULL; + token_pos = ctx->token_pos[prec]; + /* most cases a packet will count against FIFO credit */ + *ac_credit_spent = 1; + *needs_hdr = 1; + + /* search all entries, include nodes as well as interfaces */ + table = (wlfc_mac_descriptor_t*)&ctx->destination_entries; + total_entries = sizeof(ctx->destination_entries)/sizeof(wlfc_mac_descriptor_t); + + for (i = 0; i < total_entries; i++) { + entry = &table[(token_pos + i) % total_entries]; + if (entry->occupied && !entry->deleting) { + if (!_dhd_wlfc_is_destination_closed(ctx, entry, prec)) { + p = pktq_mdeq(&entry->psq, + /* higher precedence will be picked up first, + * i.e. suppressed packets before delayed ones + */ + NBITVAL((prec << 1) + 1), &pout); + *needs_hdr = 0; + + if (p == NULL) { + if (entry->suppressed == TRUE) { + if ((entry->suppr_transit_count <= + entry->suppress_count)) { + entry->suppressed = FALSE; + } else { + return NULL; + } + } + /* De-Q from delay Q */ + p = pktq_mdeq(&entry->psq, + NBITVAL((prec << 1)), + &pout); + *needs_hdr = 1; + } + + if (p != NULL) { + /* did the packet come from suppress sub-queue? */ + if (entry->requested_credit > 0) { + entry->requested_credit--; +#ifdef PROP_TXSTATUS_DEBUG + entry->dstncredit_sent_packets++; +#endif + /* + if the packet was pulled out while destination is in + closed state but had a non-zero packets requested, + then this should not count against the FIFO credit. + That is due to the fact that the firmware will + most likely hold onto this packet until a suitable + time later to push it to the appropriate AC FIFO. + */ + if (entry->state == WLFC_STATE_CLOSE) + *ac_credit_spent = 0; + } + else if (entry->requested_packet > 0) { + entry->requested_packet--; + DHD_PKTTAG_SETONETIMEPKTRQST(PKTTAG(p)); + if (entry->state == WLFC_STATE_CLOSE) + *ac_credit_spent = 0; + } + /* move token to ensure fair round-robin */ + ctx->token_pos[prec] = + (token_pos + i + 1) % total_entries; + *entry_out = entry; + _dhd_wlfc_flow_control_check(ctx, &entry->psq, + DHD_PKTTAG_IF(PKTTAG(p))); + /* + A packet has been picked up, update traffic + availability bitmap, if applicable + */ + _dhd_wlfc_traffic_pending_check(ctx, entry, prec); + return p; + } + } + } + } + return NULL; +} + +void * +_dhd_wlfc_pktq_peek_tail(struct pktq *pq, int *prec_out) +{ + int prec; + + ASSERT(pq); + + if (pq->len == 0) + return NULL; + + for (prec = 0; prec < pq->hi_prec; prec++) + /* only pick packets from dealyed-q */ + if (((prec & 1) == 0) && pq->q[prec].head) + break; + + if (prec_out) + *prec_out = prec; + + return (pq->q[prec].tail); +} + +bool +_dhd_wlfc_prec_enq_with_drop(dhd_pub_t *dhdp, struct pktq *pq, void *pkt, int prec) +{ + void *p = NULL; + int eprec = -1; /* precedence to evict from */ + + ASSERT(dhdp && pq && pkt); + ASSERT(prec >= 0 && prec < pq->num_prec); + + /* Fast case, precedence queue is not full and we are also not + * exceeding total queue length + */ + if (!pktq_pfull(pq, prec) && !pktq_full(pq)) { + pktq_penq(pq, prec, pkt); + return TRUE; + } + + /* Determine precedence from which to evict packet, if any */ + if (pktq_pfull(pq, prec)) + eprec = prec; + else if (pktq_full(pq)) { + p = _dhd_wlfc_pktq_peek_tail(pq, &eprec); + if (!p) { + WLFC_DBGMESG(("Error: %s():%d\n", __FUNCTION__, __LINE__)); + return FALSE; + } + if ((eprec > prec) || (eprec < 0)) { + if (!pktq_pempty(pq, prec)) { + eprec = prec; + } else { + return FALSE; + } + } + } + + /* Evict if needed */ + if (eprec >= 0) { + /* Detect queueing to unconfigured precedence */ + ASSERT(!pktq_pempty(pq, eprec)); + /* Evict all fragmented frames */ + dhd_prec_drop_pkts(dhdp->osh, pq, eprec); + } + + /* Enqueue */ + p = pktq_penq(pq, prec, pkt); + if (!p) { + WLFC_DBGMESG(("Error: %s():%d\n", __FUNCTION__, __LINE__)); + return FALSE; + } + + return TRUE; +} + +static int +_dhd_wlfc_enque_delayq(athost_wl_status_info_t* ctx, void* pktbuf, int prec) +{ + wlfc_mac_descriptor_t* entry; + + if (pktbuf != NULL) { + entry = _dhd_wlfc_find_table_entry(ctx, pktbuf); + + if (entry == NULL) { + WLFC_DBGMESG(("Error: %s():%d\n", __FUNCTION__, __LINE__)); + return BCME_ERROR; + } + + /* + - suppressed packets go to sub_queue[2*prec + 1] AND + - delayed packets go to sub_queue[2*prec + 0] to ensure + order of delivery. + */ + if (_dhd_wlfc_prec_enq_with_drop(ctx->dhdp, &entry->psq, pktbuf, (prec << 1)) + == FALSE) { + WLFC_DBGMESG(("D")); + /* dhd_txcomplete(ctx->dhdp, pktbuf, FALSE); */ + PKTFREE(ctx->osh, pktbuf, TRUE); + ctx->stats.delayq_full_error++; + return BCME_ERROR; + } + + /* + A packet has been pushed, update traffic availability bitmap, + if applicable + */ + _dhd_wlfc_traffic_pending_check(ctx, entry, prec); + + } + return BCME_OK; +} + +bool ifpkt_fn(void* p, int ifid) +{ + return (ifid == DHD_PKTTAG_IF(PKTTAG(p))); +} + +static int +_dhd_wlfc_mac_entry_update(athost_wl_status_info_t* ctx, wlfc_mac_descriptor_t* entry, + ewlfc_mac_entry_action_t action, uint8 ifid, uint8 iftype, uint8* ea) +{ + int rc = BCME_OK; + + + if (action == eWLFC_MAC_ENTRY_ACTION_ADD) { + entry->occupied = 1; + entry->state = WLFC_STATE_OPEN; + entry->requested_credit = 0; + entry->interface_id = ifid; + entry->iftype = iftype; + entry->ac_bitmap = 0xff; /* update this when handling APSD */ + /* for an interface entry we may not care about the MAC address */ + if (ea != NULL) + memcpy(&entry->ea[0], ea, ETHER_ADDR_LEN); + pktq_init(&entry->psq, WLFC_PSQ_PREC_COUNT, WLFC_PSQ_LEN); + } + else if (action == eWLFC_MAC_ENTRY_ACTION_UPDATE) { + entry->occupied = 1; + entry->state = WLFC_STATE_OPEN; + entry->requested_credit = 0; + entry->interface_id = ifid; + entry->iftype = iftype; + entry->ac_bitmap = 0xff; /* update this when handling APSD */ + /* for an interface entry we may not care about the MAC address */ + if (ea != NULL) + memcpy(&entry->ea[0], ea, ETHER_ADDR_LEN); + } + else if (action == eWLFC_MAC_ENTRY_ACTION_DEL) { + /* When the entry is deleted, the packets that are queued in the entry must be + cleanup. The cleanup action should be before the occupied is set as 0. The + flag deleting is set to avoid de-queue action when these queues are being + cleanup + */ + entry->deleting = 1; + dhd_wlfc_cleanup(ctx->dhdp, ifpkt_fn, ifid); + _dhd_wlfc_flow_control_check(ctx, &entry->psq, ifid); + entry->deleting = 0; + + entry->occupied = 0; + entry->suppressed = 0; + entry->state = WLFC_STATE_CLOSE; + entry->requested_credit = 0; + entry->transit_count = 0; + entry->suppr_transit_count = 0; + entry->suppress_count = 0; + memset(&entry->ea[0], 0, ETHER_ADDR_LEN); + + /* enable after packets are queued-deqeued properly. + pktq_flush(dhd->osh, &entry->psq, FALSE, NULL, 0); + */ + } + return rc; +} + +int +_dhd_wlfc_borrow_credit(athost_wl_status_info_t* ctx, uint8 available_credit_map, int borrower_ac) +{ + int lender_ac; + int rc = BCME_ERROR; + + if (ctx == NULL || available_credit_map == 0) { + WLFC_DBGMESG(("Error: %s():%d\n", __FUNCTION__, __LINE__)); + return BCME_BADARG; + } + + /* Borrow from lowest priority available AC (including BC/MC credits) */ + for (lender_ac = 0; lender_ac <= AC_COUNT; lender_ac++) { + if ((available_credit_map && (1 << lender_ac)) && + (ctx->FIFO_credit[lender_ac] > 0)) { + ctx->credits_borrowed[borrower_ac][lender_ac]++; + ctx->FIFO_credit[lender_ac]--; + rc = BCME_OK; + break; + } + } + + return rc; +} + +int +dhd_wlfc_interface_entry_update(void* state, + ewlfc_mac_entry_action_t action, uint8 ifid, uint8 iftype, uint8* ea) +{ + athost_wl_status_info_t* ctx = (athost_wl_status_info_t*)state; + wlfc_mac_descriptor_t* entry; + int ret; + + if (ifid >= WLFC_MAX_IFNUM) + return BCME_BADARG; + + entry = &ctx->destination_entries.interfaces[ifid]; + ret = _dhd_wlfc_mac_entry_update(ctx, entry, action, ifid, iftype, ea); + return ret; +} + +int +dhd_wlfc_FIFOcreditmap_update(void* state, uint8* credits) +{ + athost_wl_status_info_t* ctx = (athost_wl_status_info_t*)state; + + /* update the AC FIFO credit map */ + ctx->FIFO_credit[0] = credits[0]; + ctx->FIFO_credit[1] = credits[1]; + ctx->FIFO_credit[2] = credits[2]; + ctx->FIFO_credit[3] = credits[3]; + /* credit for bc/mc packets */ + ctx->FIFO_credit[4] = credits[4]; + /* credit for ATIM FIFO is not used yet. */ + ctx->FIFO_credit[5] = 0; + return BCME_OK; +} + +int +_dhd_wlfc_handle_packet_commit(athost_wl_status_info_t* ctx, int ac, + dhd_wlfc_commit_info_t *commit_info, f_commitpkt_t fcommit, void* commit_ctx) +{ + uint32 hslot; + int rc; + + /* + if ac_fifo_credit_spent = 0 + + This packet will not count against the FIFO credit. + To ensure the txstatus corresponding to this packet + does not provide an implied credit (default behavior) + mark the packet accordingly. + + if ac_fifo_credit_spent = 1 + + This is a normal packet and it counts against the FIFO + credit count. + */ + DHD_PKTTAG_SETCREDITCHECK(PKTTAG(commit_info->p), commit_info->ac_fifo_credit_spent); + rc = _dhd_wlfc_pretx_pktprocess(ctx, commit_info->mac_entry, commit_info->p, + commit_info->needs_hdr, &hslot); + + if (rc == BCME_OK) + rc = fcommit(commit_ctx, commit_info->p); + else + ctx->stats.generic_error++; + + if (rc == BCME_OK) { + ctx->stats.pkt2bus++; + if (commit_info->ac_fifo_credit_spent) { + ctx->stats.send_pkts[ac]++; + WLFC_HOST_FIFO_CREDIT_INC_SENTCTRS(ctx, ac); + } + } else if (rc == BCME_NORESOURCE) + rc = BCME_ERROR; + else { + /* + bus commit has failed, rollback. + - remove wl-header for a delayed packet + - save wl-header header for suppressed packets + */ + rc = _dhd_wlfc_rollback_packet_toq(ctx, commit_info->p, + (commit_info->pkt_type), hslot); + + rc = BCME_ERROR; + } + + return rc; +} + +int +dhd_wlfc_commit_packets(void* state, f_commitpkt_t fcommit, void* commit_ctx, void *pktbuf) +{ + int ac; + int credit; + int rc; + dhd_wlfc_commit_info_t commit_info; + athost_wl_status_info_t* ctx = (athost_wl_status_info_t*)state; + int credit_count = 0; + int bus_retry_count = 0; + uint8 ac_available = 0; /* Bitmask for 4 ACs + BC/MC */ + + if ((state == NULL) || + (fcommit == NULL)) { + WLFC_DBGMESG(("Error: %s():%d\n", __FUNCTION__, __LINE__)); + return BCME_BADARG; + } + + memset(&commit_info, 0, sizeof(commit_info)); + + /* + Commit packets for regular AC traffic. Higher priority first. + First, use up FIFO credits available to each AC. Based on distribution + and credits left, borrow from other ACs as applicable + + -NOTE: + If the bus between the host and firmware is overwhelmed by the + traffic from host, it is possible that higher priority traffic + starves the lower priority queue. If that occurs often, we may + have to employ weighted round-robin or ucode scheme to avoid + low priority packet starvation. + */ + + if (pktbuf) { + ac = DHD_PKTTAG_FIFO(PKTTAG(pktbuf)); + if (ETHER_ISMULTI(DHD_PKTTAG_DSTN(PKTTAG(pktbuf)))) { + ASSERT(ac == AC_COUNT); + commit_info.needs_hdr = 1; + commit_info.mac_entry = NULL; + commit_info.pkt_type = eWLFC_PKTTYPE_NEW; + commit_info.p = pktbuf; + if (ctx->FIFO_credit[ac]) { + rc = _dhd_wlfc_handle_packet_commit(ctx, ac, &commit_info, + fcommit, commit_ctx); + + /* Bus commits may fail (e.g. flow control); abort after retries */ + if (rc == BCME_OK) { + if (commit_info.ac_fifo_credit_spent) { + (void) _dhd_wlfc_borrow_credit(ctx, + ac_available, ac); + credit_count--; + } + } else { + bus_retry_count++; + if (bus_retry_count >= BUS_RETRIES) { + DHD_ERROR((" %s: bus error %d\n", + __FUNCTION__, rc)); + return rc; + } + } + } + } + else { + /* en-queue the packets to respective queue. */ + rc = _dhd_wlfc_enque_delayq(ctx, pktbuf, ac); + } + } + + for (ac = AC_COUNT; ac >= 0; ac--) { + + bool bQueueIdle = TRUE; + + /* packets from delayQ with less priority are fresh and they'd need header and + * have no MAC entry + */ + commit_info.needs_hdr = 1; + commit_info.mac_entry = NULL; + commit_info.pkt_type = eWLFC_PKTTYPE_NEW; + + for (credit = 0; credit < ctx->FIFO_credit[ac];) { + commit_info.p = _dhd_wlfc_deque_delayedq(ctx, ac, + &(commit_info.ac_fifo_credit_spent), + &(commit_info.needs_hdr), + &(commit_info.mac_entry)); + + if (commit_info.p == NULL) + break; + + bQueueIdle = FALSE; + + commit_info.pkt_type = (commit_info.needs_hdr) ? eWLFC_PKTTYPE_DELAYED : + eWLFC_PKTTYPE_SUPPRESSED; + + rc = _dhd_wlfc_handle_packet_commit(ctx, ac, &commit_info, + fcommit, commit_ctx); + + /* Bus commits may fail (e.g. flow control); abort after retries */ + if (rc == BCME_OK) { + if (commit_info.ac_fifo_credit_spent) { + credit++; + } + } + else { + bus_retry_count++; + if (bus_retry_count >= BUS_RETRIES) { + DHD_ERROR(("%s: bus error %d\n", __FUNCTION__, rc)); + ctx->FIFO_credit[ac] -= credit; + return rc; + } + } + } + + ctx->FIFO_credit[ac] -= credit; + + + /* If no pkts can be dequed, the credit can be borrowed */ + if (bQueueIdle) { + ac_available |= (1 << ac); + credit_count += ctx->FIFO_credit[ac]; + } + } + + /* We borrow only for AC_BE and only if no other traffic seen for DEFER_PERIOD + + Note that (ac_available & WLFC_AC_BE_TRAFFIC_ONLY) is done to: + a) ignore BC/MC for deferring borrow + b) ignore AC_BE being available along with other ACs + (this should happen only for pure BC/MC traffic) + + i.e. AC_VI, AC_VO, AC_BK all MUST be available (i.e. no traffic) and + we do not care if AC_BE and BC/MC are available or not + */ + if ((ac_available & WLFC_AC_BE_TRAFFIC_ONLY) == WLFC_AC_BE_TRAFFIC_ONLY) { + + if (ctx->allow_credit_borrow) { + ac = 1; /* Set ac to AC_BE and borrow credits */ + } + else { + int delta; + int curr_t = OSL_SYSUPTIME(); + + if (curr_t > ctx->borrow_defer_timestamp) + delta = curr_t - ctx->borrow_defer_timestamp; + else + delta = 0xffffffff + curr_t - ctx->borrow_defer_timestamp; + + if (delta >= WLFC_BORROW_DEFER_PERIOD_MS) { + /* Reset borrow but defer to next iteration (defensive borrowing) */ + ctx->allow_credit_borrow = TRUE; + ctx->borrow_defer_timestamp = 0; + } + return BCME_OK; + } + } + else { + /* If we have multiple AC traffic, turn off borrowing, mark time and bail out */ + ctx->allow_credit_borrow = FALSE; + ctx->borrow_defer_timestamp = OSL_SYSUPTIME(); + return BCME_OK; + } + + /* At this point, borrow all credits only for "ac" (which should be set above to AC_BE) + Generically use "ac" only in case we extend to all ACs in future + */ + for (; (credit_count > 0);) { + + commit_info.p = _dhd_wlfc_deque_delayedq(ctx, ac, + &(commit_info.ac_fifo_credit_spent), + &(commit_info.needs_hdr), + &(commit_info.mac_entry)); + if (commit_info.p == NULL) + break; + + commit_info.pkt_type = (commit_info.needs_hdr) ? eWLFC_PKTTYPE_DELAYED : + eWLFC_PKTTYPE_SUPPRESSED; + + rc = _dhd_wlfc_handle_packet_commit(ctx, ac, &commit_info, + fcommit, commit_ctx); + + /* Bus commits may fail (e.g. flow control); abort after retries */ + if (rc == BCME_OK) { + if (commit_info.ac_fifo_credit_spent) { + (void) _dhd_wlfc_borrow_credit(ctx, ac_available, ac); + credit_count--; + } + } + else { + bus_retry_count++; + if (bus_retry_count >= BUS_RETRIES) { + DHD_ERROR(("%s: bus error %d\n", __FUNCTION__, rc)); + return rc; + } + } + } + return BCME_OK; +} + +static uint8 +dhd_wlfc_find_mac_desc_id_from_mac(dhd_pub_t *dhdp, uint8* ea) +{ + wlfc_mac_descriptor_t* table = + ((athost_wl_status_info_t*)dhdp->wlfc_state)->destination_entries.nodes; + uint8 table_index; + + if (ea != NULL) { + for (table_index = 0; table_index < WLFC_MAC_DESC_TABLE_SIZE; table_index++) { + if ((memcmp(ea, &table[table_index].ea[0], ETHER_ADDR_LEN) == 0) && + table[table_index].occupied) + return table_index; + } + } + return WLFC_MAC_DESC_ID_INVALID; +} + +void +dhd_wlfc_txcomplete(dhd_pub_t *dhd, void *txp, bool success) +{ + athost_wl_status_info_t* wlfc = (athost_wl_status_info_t*) + dhd->wlfc_state; + void* p; + int fifo_id; + + if (DHD_PKTTAG_SIGNALONLY(PKTTAG(txp))) { +#ifdef PROP_TXSTATUS_DEBUG + wlfc->stats.signal_only_pkts_freed++; +#endif + /* is this a signal-only packet? */ + if (success) + PKTFREE(wlfc->osh, txp, TRUE); + return; + } + if (!success) { + WLFC_DBGMESG(("At: %s():%d, bus_complete() failure for %p, htod_tag:0x%08x\n", + __FUNCTION__, __LINE__, txp, DHD_PKTTAG_H2DTAG(PKTTAG(txp)))); + dhd_wlfc_hanger_poppkt(wlfc->hanger, WLFC_PKTID_HSLOT_GET(DHD_PKTTAG_H2DTAG + (PKTTAG(txp))), &p, 1); + + /* indicate failure and free the packet */ + dhd_txcomplete(dhd, txp, FALSE); + + /* return the credit, if necessary */ + if (DHD_PKTTAG_CREDITCHECK(PKTTAG(txp))) { + int lender, credit_returned = 0; /* Note that borrower is fifo_id */ + + fifo_id = DHD_PKTTAG_FIFO(PKTTAG(txp)); + + /* Return credits to highest priority lender first */ + for (lender = AC_COUNT; lender >= 0; lender--) { + if (wlfc->credits_borrowed[fifo_id][lender] > 0) { + wlfc->FIFO_credit[lender]++; + wlfc->credits_borrowed[fifo_id][lender]--; + credit_returned = 1; + break; + } + } + + if (!credit_returned) { + wlfc->FIFO_credit[fifo_id]++; + } + } + + PKTFREE(wlfc->osh, txp, TRUE); + } + return; +} + +static int +dhd_wlfc_compressed_txstatus_update(dhd_pub_t *dhd, uint8* pkt_info, uint8 len) +{ + uint8 status_flag; + uint32 status; + int ret; + int remove_from_hanger = 1; + void* pktbuf; + uint8 fifo_id; + uint8 count = 0; + uint32 status_g; + uint32 hslot, hcnt; + wlfc_mac_descriptor_t* entry = NULL; + athost_wl_status_info_t* wlfc = (athost_wl_status_info_t*) + dhd->wlfc_state; + + memcpy(&status, pkt_info, sizeof(uint32)); + status_flag = WL_TXSTATUS_GET_FLAGS(status); + status_g = status & 0xff000000; + hslot = (status & 0x00ffff00) >> 8; + hcnt = status & 0xff; + len = pkt_info[4]; + + wlfc->stats.txstatus_in++; + + if (status_flag == WLFC_CTL_PKTFLAG_DISCARD) { + wlfc->stats.pkt_freed++; + } + + else if (status_flag == WLFC_CTL_PKTFLAG_D11SUPPRESS) { + wlfc->stats.d11_suppress++; + remove_from_hanger = 0; + } + + else if (status_flag == WLFC_CTL_PKTFLAG_WLSUPPRESS) { + wlfc->stats.wl_suppress++; + remove_from_hanger = 0; + } + + else if (status_flag == WLFC_CTL_PKTFLAG_TOSSED_BYWLC) { + wlfc->stats.wlc_tossed_pkts++; + } + while (count < len) { + status = (status_g << 24) | (hslot << 8) | (hcnt); + count++; + hslot++; + hcnt++; + + ret = dhd_wlfc_hanger_poppkt(wlfc->hanger, + WLFC_PKTID_HSLOT_GET(status), &pktbuf, remove_from_hanger); + if (ret != BCME_OK) { + /* do something */ + continue; + } + + entry = _dhd_wlfc_find_table_entry(wlfc, pktbuf); + + if (!remove_from_hanger) { + /* this packet was suppressed */ + if (!entry->suppressed || entry->generation != WLFC_PKTID_GEN(status)) { + entry->suppressed = TRUE; + entry->suppress_count = pktq_mlen(&entry->psq, + NBITVAL((WL_TXSTATUS_GET_FIFO(status) << 1) + 1)); + entry->suppr_transit_count = entry->transit_count; + } + entry->generation = WLFC_PKTID_GEN(status); + } + +#ifdef PROP_TXSTATUS_DEBUG + { + uint32 new_t = OSL_SYSUPTIME(); + uint32 old_t; + uint32 delta; + old_t = ((wlfc_hanger_t*)(wlfc->hanger))->items[ + WLFC_PKTID_HSLOT_GET(status)].push_time; + + + wlfc->stats.latency_sample_count++; + if (new_t > old_t) + delta = new_t - old_t; + else + delta = 0xffffffff + new_t - old_t; + wlfc->stats.total_status_latency += delta; + wlfc->stats.latency_most_recent = delta; + + wlfc->stats.deltas[wlfc->stats.idx_delta++] = delta; + if (wlfc->stats.idx_delta == sizeof(wlfc->stats.deltas)/sizeof(uint32)) + wlfc->stats.idx_delta = 0; + } +#endif /* PROP_TXSTATUS_DEBUG */ + + fifo_id = DHD_PKTTAG_FIFO(PKTTAG(pktbuf)); + + /* pick up the implicit credit from this packet */ + if (DHD_PKTTAG_CREDITCHECK(PKTTAG(pktbuf))) { + if (wlfc->proptxstatus_mode == WLFC_FCMODE_IMPLIED_CREDIT) { + + int lender, credit_returned = 0; /* Note that borrower is fifo_id */ + + /* Return credits to highest priority lender first */ + for (lender = AC_COUNT; lender >= 0; lender--) { + if (wlfc->credits_borrowed[fifo_id][lender] > 0) { + wlfc->FIFO_credit[lender]++; + wlfc->credits_borrowed[fifo_id][lender]--; + credit_returned = 1; + break; + } + } + + if (!credit_returned) { + wlfc->FIFO_credit[fifo_id]++; + } + } + } + else { + /* + if this packet did not count against FIFO credit, it must have + taken a requested_credit from the destination entry (for pspoll etc.) + */ + if (!entry) { + + entry = _dhd_wlfc_find_table_entry(wlfc, pktbuf); + } + if (!DHD_PKTTAG_ONETIMEPKTRQST(PKTTAG(pktbuf))) + entry->requested_credit++; +#ifdef PROP_TXSTATUS_DEBUG + entry->dstncredit_acks++; +#endif + } + if ((status_flag == WLFC_CTL_PKTFLAG_D11SUPPRESS) || + (status_flag == WLFC_CTL_PKTFLAG_WLSUPPRESS)) { + + ret = _dhd_wlfc_enque_suppressed(wlfc, fifo_id, pktbuf); + if (ret != BCME_OK) { + /* delay q is full, drop this packet */ + dhd_wlfc_hanger_poppkt(wlfc->hanger, WLFC_PKTID_HSLOT_GET(status), + &pktbuf, 1); + + /* indicate failure and free the packet */ + dhd_txcomplete(dhd, pktbuf, FALSE); + entry->transit_count--; + DHD_WLFC_QMON_COMPLETE(entry); + /* packet is transmitted Successfully by dongle + * after first suppress. + */ + if (entry->suppressed) { + entry->suppr_transit_count--; + } + PKTFREE(wlfc->osh, pktbuf, TRUE); + } else { + /* Mark suppressed to avoid a double free during wlfc cleanup */ + + dhd_wlfc_hanger_mark_suppressed(wlfc->hanger, + WLFC_PKTID_HSLOT_GET(status), WLFC_PKTID_GEN(status)); + entry->suppress_count++; + } + } + else { + dhd_txcomplete(dhd, pktbuf, TRUE); + entry->transit_count--; + DHD_WLFC_QMON_COMPLETE(entry); + + /* This packet is transmitted Successfully by dongle + * even after first suppress. + */ + if (entry->suppressed) { + entry->suppr_transit_count--; + } + /* free the packet */ + PKTFREE(wlfc->osh, pktbuf, TRUE); + } + } + return BCME_OK; +} + +/* Handle discard or suppress indication */ +static int +dhd_wlfc_txstatus_update(dhd_pub_t *dhd, uint8* pkt_info) +{ + uint8 status_flag; + uint32 status; + int ret; + int remove_from_hanger = 1; + void* pktbuf; + uint8 fifo_id; + wlfc_mac_descriptor_t* entry = NULL; + athost_wl_status_info_t* wlfc = (athost_wl_status_info_t*) + dhd->wlfc_state; + + memcpy(&status, pkt_info, sizeof(uint32)); + status_flag = WL_TXSTATUS_GET_FLAGS(status); + wlfc->stats.txstatus_in++; + + if (status_flag == WLFC_CTL_PKTFLAG_DISCARD) { + wlfc->stats.pkt_freed++; + } + + else if (status_flag == WLFC_CTL_PKTFLAG_D11SUPPRESS) { + wlfc->stats.d11_suppress++; + remove_from_hanger = 0; + } + + else if (status_flag == WLFC_CTL_PKTFLAG_WLSUPPRESS) { + wlfc->stats.wl_suppress++; + remove_from_hanger = 0; + } + + else if (status_flag == WLFC_CTL_PKTFLAG_TOSSED_BYWLC) { + wlfc->stats.wlc_tossed_pkts++; + } + + ret = dhd_wlfc_hanger_poppkt(wlfc->hanger, + WLFC_PKTID_HSLOT_GET(status), &pktbuf, remove_from_hanger); + if (ret != BCME_OK) { + /* do something */ + return ret; + } + + entry = _dhd_wlfc_find_table_entry(wlfc, pktbuf); + + if (!remove_from_hanger) { + /* this packet was suppressed */ + if (!entry->suppressed || entry->generation != WLFC_PKTID_GEN(status)) { + entry->suppressed = TRUE; + entry->suppress_count = pktq_mlen(&entry->psq, + NBITVAL((WL_TXSTATUS_GET_FIFO(status) << 1) + 1)); + entry->suppr_transit_count = entry->transit_count; + } + entry->generation = WLFC_PKTID_GEN(status); + } + +#ifdef PROP_TXSTATUS_DEBUG + { + uint32 new_t = OSL_SYSUPTIME(); + uint32 old_t; + uint32 delta; + old_t = ((wlfc_hanger_t*)(wlfc->hanger))->items[ + WLFC_PKTID_HSLOT_GET(status)].push_time; + + + wlfc->stats.latency_sample_count++; + if (new_t > old_t) + delta = new_t - old_t; + else + delta = 0xffffffff + new_t - old_t; + wlfc->stats.total_status_latency += delta; + wlfc->stats.latency_most_recent = delta; + + wlfc->stats.deltas[wlfc->stats.idx_delta++] = delta; + if (wlfc->stats.idx_delta == sizeof(wlfc->stats.deltas)/sizeof(uint32)) + wlfc->stats.idx_delta = 0; + } +#endif /* PROP_TXSTATUS_DEBUG */ + + fifo_id = DHD_PKTTAG_FIFO(PKTTAG(pktbuf)); + + /* pick up the implicit credit from this packet */ + if (DHD_PKTTAG_CREDITCHECK(PKTTAG(pktbuf))) { + if (wlfc->proptxstatus_mode == WLFC_FCMODE_IMPLIED_CREDIT) { + + int lender, credit_returned = 0; /* Note that borrower is fifo_id */ + + /* Return credits to highest priority lender first */ + for (lender = AC_COUNT; lender >= 0; lender--) { + if (wlfc->credits_borrowed[fifo_id][lender] > 0) { + wlfc->FIFO_credit[lender]++; + wlfc->credits_borrowed[fifo_id][lender]--; + credit_returned = 1; + break; + } + } + + if (!credit_returned) { + wlfc->FIFO_credit[fifo_id]++; + } + } + } + else { + /* + if this packet did not count against FIFO credit, it must have + taken a requested_credit from the destination entry (for pspoll etc.) + */ + if (!entry) { + + entry = _dhd_wlfc_find_table_entry(wlfc, pktbuf); + } + if (!DHD_PKTTAG_ONETIMEPKTRQST(PKTTAG(pktbuf))) + entry->requested_credit++; +#ifdef PROP_TXSTATUS_DEBUG + entry->dstncredit_acks++; +#endif + } + if ((status_flag == WLFC_CTL_PKTFLAG_D11SUPPRESS) || + (status_flag == WLFC_CTL_PKTFLAG_WLSUPPRESS)) { + + ret = _dhd_wlfc_enque_suppressed(wlfc, fifo_id, pktbuf); + if (ret != BCME_OK) { + /* delay q is full, drop this packet */ + dhd_wlfc_hanger_poppkt(wlfc->hanger, WLFC_PKTID_HSLOT_GET(status), + &pktbuf, 1); + + /* indicate failure and free the packet */ + dhd_txcomplete(dhd, pktbuf, FALSE); + entry->transit_count--; + DHD_WLFC_QMON_COMPLETE(entry); + /* This packet is transmitted Successfully by + * dongle even after first suppress. + */ + if (entry->suppressed) { + entry->suppr_transit_count--; + } + PKTFREE(wlfc->osh, pktbuf, TRUE); + } else { + /* Mark suppressed to avoid a double free during wlfc cleanup */ + + dhd_wlfc_hanger_mark_suppressed(wlfc->hanger, + WLFC_PKTID_HSLOT_GET(status), WLFC_PKTID_GEN(status)); + entry->suppress_count++; + } + } + else { + dhd_txcomplete(dhd, pktbuf, TRUE); + entry->transit_count--; + DHD_WLFC_QMON_COMPLETE(entry); + + /* This packet is transmitted Successfully by dongle even after first suppress. */ + if (entry->suppressed) { + entry->suppr_transit_count--; + } + /* free the packet */ + PKTFREE(wlfc->osh, pktbuf, TRUE); + } + return BCME_OK; +} + +static int +dhd_wlfc_fifocreditback_indicate(dhd_pub_t *dhd, uint8* credits) +{ + int i; + athost_wl_status_info_t* wlfc = (athost_wl_status_info_t*) + dhd->wlfc_state; + for (i = 0; i < WLFC_CTL_VALUE_LEN_FIFO_CREDITBACK; i++) { +#ifdef PROP_TXSTATUS_DEBUG + wlfc->stats.fifo_credits_back[i] += credits[i]; +#endif + /* update FIFO credits */ + if (wlfc->proptxstatus_mode == WLFC_FCMODE_EXPLICIT_CREDIT) + { + int lender; /* Note that borrower is i */ + + /* Return credits to highest priority lender first */ + for (lender = AC_COUNT; (lender >= 0) && (credits[i] > 0); lender--) { + if (wlfc->credits_borrowed[i][lender] > 0) { + if (credits[i] >= wlfc->credits_borrowed[i][lender]) { + credits[i] -= wlfc->credits_borrowed[i][lender]; + wlfc->FIFO_credit[lender] += + wlfc->credits_borrowed[i][lender]; + wlfc->credits_borrowed[i][lender] = 0; + } + else { + wlfc->credits_borrowed[i][lender] -= credits[i]; + wlfc->FIFO_credit[lender] += credits[i]; + credits[i] = 0; + } + } + } + + /* If we have more credits left over, these must belong to the AC */ + if (credits[i] > 0) { + wlfc->FIFO_credit[i] += credits[i]; + } + } + } + + return BCME_OK; +} + +static int +dhd_wlfc_dbg_senum_check(dhd_pub_t *dhd, uint8 *value) +{ + uint32 timestamp; + + (void)dhd; + + bcopy(&value[2], ×tamp, sizeof(uint32)); + DHD_INFO(("RXPKT: SEQ: %d, timestamp %d\n", value[1], timestamp)); + return BCME_OK; +} + + +static int +dhd_wlfc_rssi_indicate(dhd_pub_t *dhd, uint8* rssi) +{ + (void)dhd; + (void)rssi; + return BCME_OK; +} + +static int +dhd_wlfc_mac_table_update(dhd_pub_t *dhd, uint8* value, uint8 type) +{ + int rc; + athost_wl_status_info_t* wlfc = (athost_wl_status_info_t*) + dhd->wlfc_state; + wlfc_mac_descriptor_t* table; + uint8 existing_index; + uint8 table_index; + uint8 ifid; + uint8* ea; + + WLFC_DBGMESG(("%s(), mac [%02x:%02x:%02x:%02x:%02x:%02x],%s,idx:%d,id:0x%02x\n", + __FUNCTION__, value[2], value[3], value[4], value[5], value[6], value[7], + ((type == WLFC_CTL_TYPE_MACDESC_ADD) ? "ADD":"DEL"), + WLFC_MAC_DESC_GET_LOOKUP_INDEX(value[0]), value[0])); + + table = wlfc->destination_entries.nodes; + table_index = WLFC_MAC_DESC_GET_LOOKUP_INDEX(value[0]); + ifid = value[1]; + ea = &value[2]; + + if (type == WLFC_CTL_TYPE_MACDESC_ADD) { + existing_index = dhd_wlfc_find_mac_desc_id_from_mac(dhd, &value[2]); + if (existing_index == WLFC_MAC_DESC_ID_INVALID) { + /* this MAC entry does not exist, create one */ + if (!table[table_index].occupied) { + table[table_index].mac_handle = value[0]; + rc = _dhd_wlfc_mac_entry_update(wlfc, &table[table_index], + eWLFC_MAC_ENTRY_ACTION_ADD, ifid, + wlfc->destination_entries.interfaces[ifid].iftype, + ea); + } + else { + /* the space should have been empty, but it's not */ + wlfc->stats.mac_update_failed++; + } + } + else { + /* + there is an existing entry, move it to new index + if necessary. + */ + if (existing_index != table_index) { + /* if we already have an entry, free the old one */ + table[existing_index].occupied = 0; + table[existing_index].state = WLFC_STATE_CLOSE; + table[existing_index].requested_credit = 0; + table[existing_index].interface_id = 0; + /* enable after packets are queued-deqeued properly. + pktq_flush(dhd->osh, &table[existing_index].psq, FALSE, NULL, 0); + */ + } + } + } + if (type == WLFC_CTL_TYPE_MACDESC_DEL) { + if (table[table_index].occupied) { + rc = _dhd_wlfc_mac_entry_update(wlfc, &table[table_index], + eWLFC_MAC_ENTRY_ACTION_DEL, ifid, + wlfc->destination_entries.interfaces[ifid].iftype, + ea); + } + else { + /* the space should have been occupied, but it's not */ + wlfc->stats.mac_update_failed++; + } + } + BCM_REFERENCE(rc); + return BCME_OK; +} + +static int +dhd_wlfc_psmode_update(dhd_pub_t *dhd, uint8* value, uint8 type) +{ + /* Handle PS on/off indication */ + athost_wl_status_info_t* wlfc = (athost_wl_status_info_t*) + dhd->wlfc_state; + wlfc_mac_descriptor_t* table; + wlfc_mac_descriptor_t* desc; + uint8 mac_handle = value[0]; + int i; + + table = wlfc->destination_entries.nodes; + desc = &table[WLFC_MAC_DESC_GET_LOOKUP_INDEX(mac_handle)]; + if (desc->occupied) { + /* a fresh PS mode should wipe old ps credits? */ + desc->requested_credit = 0; + if (type == WLFC_CTL_TYPE_MAC_OPEN) { + desc->state = WLFC_STATE_OPEN; + DHD_WLFC_CTRINC_MAC_OPEN(desc); + } + else { + desc->state = WLFC_STATE_CLOSE; + DHD_WLFC_CTRINC_MAC_CLOSE(desc); + /* + Indicate to firmware if there is any traffic pending. + */ + for (i = AC_BE; i < AC_COUNT; i++) { + _dhd_wlfc_traffic_pending_check(wlfc, desc, i); + } + } + } + else { + wlfc->stats.psmode_update_failed++; + } + return BCME_OK; +} + +static int +dhd_wlfc_interface_update(dhd_pub_t *dhd, uint8* value, uint8 type) +{ + /* Handle PS on/off indication */ + athost_wl_status_info_t* wlfc = (athost_wl_status_info_t*) + dhd->wlfc_state; + wlfc_mac_descriptor_t* table; + uint8 if_id = value[0]; + + if (if_id < WLFC_MAX_IFNUM) { + table = wlfc->destination_entries.interfaces; + if (table[if_id].occupied) { + if (type == WLFC_CTL_TYPE_INTERFACE_OPEN) { + table[if_id].state = WLFC_STATE_OPEN; + /* WLFC_DBGMESG(("INTERFACE[%d] OPEN\n", if_id)); */ + } + else { + table[if_id].state = WLFC_STATE_CLOSE; + /* WLFC_DBGMESG(("INTERFACE[%d] CLOSE\n", if_id)); */ + } + return BCME_OK; + } + } + wlfc->stats.interface_update_failed++; + + return BCME_OK; +} + +static int +dhd_wlfc_credit_request(dhd_pub_t *dhd, uint8* value) +{ + athost_wl_status_info_t* wlfc = (athost_wl_status_info_t*) + dhd->wlfc_state; + wlfc_mac_descriptor_t* table; + wlfc_mac_descriptor_t* desc; + uint8 mac_handle; + uint8 credit; + + table = wlfc->destination_entries.nodes; + mac_handle = value[1]; + credit = value[0]; + + desc = &table[WLFC_MAC_DESC_GET_LOOKUP_INDEX(mac_handle)]; + if (desc->occupied) { + desc->requested_credit = credit; + + desc->ac_bitmap = value[2]; + } + else { + wlfc->stats.credit_request_failed++; + } + return BCME_OK; +} + +static int +dhd_wlfc_packet_request(dhd_pub_t *dhd, uint8* value) +{ + athost_wl_status_info_t* wlfc = (athost_wl_status_info_t*) + dhd->wlfc_state; + wlfc_mac_descriptor_t* table; + wlfc_mac_descriptor_t* desc; + uint8 mac_handle; + uint8 packet_count; + + table = wlfc->destination_entries.nodes; + mac_handle = value[1]; + packet_count = value[0]; + + desc = &table[WLFC_MAC_DESC_GET_LOOKUP_INDEX(mac_handle)]; + if (desc->occupied) { + desc->requested_packet = packet_count; + + desc->ac_bitmap = value[2]; + } + else { + wlfc->stats.packet_request_failed++; + } + return BCME_OK; +} + +static void +dhd_wlfc_reorderinfo_indicate(uint8 *val, uint8 len, uchar *info_buf, uint *info_len) +{ + if (info_len) { + if (info_buf) { + bcopy(val, info_buf, len); + *info_len = len; + } + else + *info_len = 0; + } +} + +int +dhd_wlfc_parse_header_info(dhd_pub_t *dhd, void* pktbuf, int tlv_hdr_len, uchar *reorder_info_buf, + uint *reorder_info_len) +{ + uint8 type, len; + uint8* value; + uint8* tmpbuf; + uint16 remainder = tlv_hdr_len; + uint16 processed = 0; + athost_wl_status_info_t* wlfc = (athost_wl_status_info_t*) + dhd->wlfc_state; + tmpbuf = (uint8*)PKTDATA(dhd->osh, pktbuf); + if (remainder) { + while ((processed < (WLFC_MAX_PENDING_DATALEN * 2)) && (remainder > 0)) { + type = tmpbuf[processed]; + if (type == WLFC_CTL_TYPE_FILLER) { + remainder -= 1; + processed += 1; + continue; + } + + len = tmpbuf[processed + 1]; + value = &tmpbuf[processed + 2]; + + if (remainder < (2 + len)) + break; + + remainder -= 2 + len; + processed += 2 + len; + if (type == WLFC_CTL_TYPE_TXSTATUS) + dhd_wlfc_txstatus_update(dhd, value); + if (type == WLFC_CTL_TYPE_COMP_TXSTATUS) + dhd_wlfc_compressed_txstatus_update(dhd, value, len); + + else if (type == WLFC_CTL_TYPE_HOST_REORDER_RXPKTS) + dhd_wlfc_reorderinfo_indicate(value, len, reorder_info_buf, + reorder_info_len); + else if (type == WLFC_CTL_TYPE_FIFO_CREDITBACK) + dhd_wlfc_fifocreditback_indicate(dhd, value); + + else if (type == WLFC_CTL_TYPE_RSSI) + dhd_wlfc_rssi_indicate(dhd, value); + + else if (type == WLFC_CTL_TYPE_MAC_REQUEST_CREDIT) + dhd_wlfc_credit_request(dhd, value); + + else if (type == WLFC_CTL_TYPE_MAC_REQUEST_PACKET) + dhd_wlfc_packet_request(dhd, value); + + else if ((type == WLFC_CTL_TYPE_MAC_OPEN) || + (type == WLFC_CTL_TYPE_MAC_CLOSE)) + dhd_wlfc_psmode_update(dhd, value, type); + + else if ((type == WLFC_CTL_TYPE_MACDESC_ADD) || + (type == WLFC_CTL_TYPE_MACDESC_DEL)) + dhd_wlfc_mac_table_update(dhd, value, type); + + else if (type == WLFC_CTL_TYPE_TRANS_ID) + dhd_wlfc_dbg_senum_check(dhd, value); + + else if ((type == WLFC_CTL_TYPE_INTERFACE_OPEN) || + (type == WLFC_CTL_TYPE_INTERFACE_CLOSE)) { + dhd_wlfc_interface_update(dhd, value, type); + } + } + if (remainder != 0) { + /* trouble..., something is not right */ + wlfc->stats.tlv_parse_failed++; + } + } + return BCME_OK; +} + +int +dhd_wlfc_init(dhd_pub_t *dhd) +{ + char iovbuf[12]; /* Room for "tlv" + '\0' + parameter */ + /* enable all signals & indicate host proptxstatus logic is active */ + uint32 tlv = dhd->wlfc_enabled? + WLFC_FLAGS_RSSI_SIGNALS | + WLFC_FLAGS_XONXOFF_SIGNALS | + WLFC_FLAGS_CREDIT_STATUS_SIGNALS | + WLFC_FLAGS_HOST_PROPTXSTATUS_ACTIVE | + WLFC_FLAGS_HOST_RXRERODER_ACTIVE : 0; + /* WLFC_FLAGS_HOST_PROPTXSTATUS_ACTIVE | WLFC_FLAGS_HOST_RXRERODER_ACTIVE : 0; */ + + + /* + try to enable/disable signaling by sending "tlv" iovar. if that fails, + fallback to no flow control? Print a message for now. + */ + + /* enable proptxtstatus signaling by default */ + bcm_mkiovar("tlv", (char *)&tlv, 4, iovbuf, sizeof(iovbuf)); + if (dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0) < 0) { + DHD_ERROR(("dhd_wlfc_init(): failed to enable/disable bdcv2 tlv signaling\n")); + } + else { + /* + Leaving the message for now, it should be removed after a while; once + the tlv situation is stable. + */ + DHD_ERROR(("dhd_wlfc_init(): successfully %s bdcv2 tlv signaling, %d\n", + dhd->wlfc_enabled?"enabled":"disabled", tlv)); + } + return BCME_OK; +} + +int +dhd_wlfc_enable(dhd_pub_t *dhd) +{ + int i; + athost_wl_status_info_t* wlfc; + + if (!dhd->wlfc_enabled || dhd->wlfc_state) + return BCME_OK; + + /* allocate space to track txstatus propagated from firmware */ + dhd->wlfc_state = MALLOC(dhd->osh, sizeof(athost_wl_status_info_t)); + if (dhd->wlfc_state == NULL) + return BCME_NOMEM; + + /* initialize state space */ + wlfc = (athost_wl_status_info_t*)dhd->wlfc_state; + memset(wlfc, 0, sizeof(athost_wl_status_info_t)); + + /* remember osh & dhdp */ + wlfc->osh = dhd->osh; + wlfc->dhdp = dhd; + + wlfc->hanger = + dhd_wlfc_hanger_create(dhd->osh, WLFC_HANGER_MAXITEMS); + if (wlfc->hanger == NULL) { + MFREE(dhd->osh, dhd->wlfc_state, sizeof(athost_wl_status_info_t)); + dhd->wlfc_state = NULL; + DHD_ERROR(("Failed to malloc dhd->wlfc_state\n")); + return BCME_NOMEM; + } + + /* initialize all interfaces to accept traffic */ + for (i = 0; i < WLFC_MAX_IFNUM; i++) { + wlfc->hostif_flow_state[i] = OFF; + } + + wlfc->destination_entries.other.state = WLFC_STATE_OPEN; + /* bc/mc FIFO is always open [credit aside], i.e. b[5] */ + wlfc->destination_entries.other.ac_bitmap = 0x1f; + wlfc->destination_entries.other.interface_id = 0; + + wlfc->proptxstatus_mode = WLFC_FCMODE_EXPLICIT_CREDIT; + + wlfc->allow_credit_borrow = TRUE; + wlfc->borrow_defer_timestamp = 0; + + return BCME_OK; +} + +int +dhd_wlfc_suspend(dhd_pub_t *dhd) +{ + + uint32 iovbuf[4]; /* Room for "tlv" + '\0' + parameter */ + uint32 tlv = 0; + + DHD_TRACE(("%s: masking wlfc events\n", __FUNCTION__)); + if (!dhd->wlfc_enabled) + return -1; + + bcm_mkiovar("tlv", NULL, 0, (char*)iovbuf, sizeof(iovbuf)); + if (dhd_wl_ioctl_cmd(dhd, WLC_GET_VAR, iovbuf, sizeof(iovbuf), FALSE, 0) < 0) { + DHD_ERROR(("%s: failed to get bdcv2 tlv signaling\n", __FUNCTION__)); + return -1; + } + tlv = iovbuf[0]; + if ((tlv & (WLFC_FLAGS_RSSI_SIGNALS | WLFC_FLAGS_XONXOFF_SIGNALS)) == 0) + return 0; + tlv &= ~(WLFC_FLAGS_RSSI_SIGNALS | WLFC_FLAGS_XONXOFF_SIGNALS); + bcm_mkiovar("tlv", (char *)&tlv, 4, (char*)iovbuf, sizeof(iovbuf)); + if (dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0) < 0) { + DHD_ERROR(("%s: failed to set bdcv2 tlv signaling to 0x%x\n", + __FUNCTION__, tlv)); + return -1; + } + + return 0; +} + +int +dhd_wlfc_resume(dhd_pub_t *dhd) +{ + uint32 iovbuf[4]; /* Room for "tlv" + '\0' + parameter */ + uint32 tlv = 0; + + DHD_TRACE(("%s: unmasking wlfc events\n", __FUNCTION__)); + if (!dhd->wlfc_enabled) + return -1; + + bcm_mkiovar("tlv", NULL, 0, (char*)iovbuf, sizeof(iovbuf)); + if (dhd_wl_ioctl_cmd(dhd, WLC_GET_VAR, iovbuf, sizeof(iovbuf), FALSE, 0) < 0) { + DHD_ERROR(("%s: failed to get bdcv2 tlv signaling\n", __FUNCTION__)); + return -1; + } + tlv = iovbuf[0]; + if ((tlv & (WLFC_FLAGS_RSSI_SIGNALS | WLFC_FLAGS_XONXOFF_SIGNALS)) == + (WLFC_FLAGS_RSSI_SIGNALS | WLFC_FLAGS_XONXOFF_SIGNALS)) + return 0; + tlv |= (WLFC_FLAGS_RSSI_SIGNALS | WLFC_FLAGS_XONXOFF_SIGNALS); + bcm_mkiovar("tlv", (char *)&tlv, 4, (char*)iovbuf, sizeof(iovbuf)); + if (dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, (char*)iovbuf, sizeof(iovbuf), TRUE, 0) < 0) { + DHD_ERROR(("%s: failed to set bdcv2 tlv signaling to 0x%x\n", + __FUNCTION__, tlv)); + return -1; + } + + return 0; +} + +/* release all packet resources */ +void +dhd_wlfc_cleanup(dhd_pub_t *dhd, ifpkt_cb_t fn, int arg) +{ + int i; + int total_entries; + athost_wl_status_info_t* wlfc = (athost_wl_status_info_t*) + dhd->wlfc_state; + wlfc_mac_descriptor_t* table; + wlfc_hanger_t* h; + int prec; + void *pkt = NULL; + struct pktq *txq = NULL; + if (dhd->wlfc_state == NULL) + return; + /* flush bus->txq */ + txq = dhd_bus_txq(dhd->bus); + /* any in the hanger? */ + h = (wlfc_hanger_t*)wlfc->hanger; + total_entries = sizeof(wlfc->destination_entries)/sizeof(wlfc_mac_descriptor_t); + /* search all entries, include nodes as well as interfaces */ + table = (wlfc_mac_descriptor_t*)&wlfc->destination_entries; + + for (i = 0; i < total_entries; i++) { + if (table[i].occupied && (fn == NULL || (arg == table[i].interface_id))) { + if (table[i].psq.len) { + WLFC_DBGMESG(("%s(): DELAYQ[%d].len = %d\n", + __FUNCTION__, i, table[i].psq.len)); + /* release packets held in DELAYQ */ + pktq_flush(wlfc->osh, &table[i].psq, TRUE, fn, arg); + } + if (fn == NULL) + table[i].occupied = 0; + } + } + for (prec = 0; prec < txq->num_prec; prec++) { + pkt = pktq_pdeq_with_fn(txq, prec, fn, arg); + while (pkt) { + for (i = 0; i < h->max_items; i++) { + if (pkt == h->items[i].pkt) { + if (h->items[i].state == WLFC_HANGER_ITEM_STATE_INUSE) { + PKTFREE(wlfc->osh, h->items[i].pkt, TRUE); + h->items[i].state = WLFC_HANGER_ITEM_STATE_FREE; + } else if (h->items[i].state == + WLFC_HANGER_ITEM_STATE_INUSE_SUPPRESSED) { + /* These are already freed from the psq */ + h->items[i].state = WLFC_HANGER_ITEM_STATE_FREE; + } + break; + } + } + pkt = pktq_pdeq(txq, prec); + } + } + /* flush remained pkt in hanger queue, not in bus->txq */ + for (i = 0; i < h->max_items; i++) { + if (h->items[i].state == WLFC_HANGER_ITEM_STATE_INUSE) { + if (fn == NULL || (*fn)(h->items[i].pkt, arg)) { + PKTFREE(wlfc->osh, h->items[i].pkt, TRUE); + h->items[i].state = WLFC_HANGER_ITEM_STATE_FREE; + } + } else if (h->items[i].state == WLFC_HANGER_ITEM_STATE_INUSE_SUPPRESSED) { + if (fn == NULL || (*fn)(h->items[i].pkt, arg)) { + /* These are freed from the psq so no need to free again */ + h->items[i].state = WLFC_HANGER_ITEM_STATE_FREE; + } + } + } + return; +} + +void +dhd_wlfc_deinit(dhd_pub_t *dhd) +{ + /* cleanup all psq related resources */ + athost_wl_status_info_t* wlfc = (athost_wl_status_info_t*) + dhd->wlfc_state; + + dhd_os_wlfc_block(dhd); + if (dhd->wlfc_state == NULL) { + dhd_os_wlfc_unblock(dhd); + return; + } + +#ifdef PROP_TXSTATUS_DEBUG + { + int i; + wlfc_hanger_t* h = (wlfc_hanger_t*)wlfc->hanger; + for (i = 0; i < h->max_items; i++) { + if (h->items[i].state != WLFC_HANGER_ITEM_STATE_FREE) { + WLFC_DBGMESG(("%s() pkt[%d] = 0x%p, FIFO_credit_used:%d\n", + __FUNCTION__, i, h->items[i].pkt, + DHD_PKTTAG_CREDITCHECK(PKTTAG(h->items[i].pkt)))); + } + } + } +#endif + /* delete hanger */ + dhd_wlfc_hanger_delete(dhd->osh, wlfc->hanger); + + /* free top structure */ + MFREE(dhd->osh, dhd->wlfc_state, sizeof(athost_wl_status_info_t)); + dhd->wlfc_state = NULL; + dhd_os_wlfc_unblock(dhd); + + return; +} +#endif /* PROP_TXSTATUS */ diff --git a/drivers/net/wireless/bcmdhd/dhd_wlfc.h b/drivers/net/wireless/bcmdhd/dhd_wlfc.h index 0eaaa0fa8c7..dcc64ac8dbb 100644 --- a/drivers/net/wireless/bcmdhd/dhd_wlfc.h +++ b/drivers/net/wireless/bcmdhd/dhd_wlfc.h @@ -1,5 +1,5 @@ /* -* Copyright (C) 1999-2012, Broadcom Corporation +* Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -18,12 +18,14 @@ * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. -* $Id: dhd_wlfc.h 381116 2013-01-25 06:08:41Z $ +* $Id: dhd_wlfc.h 444108 2013-12-18 17:39:51Z $ * */ #ifndef __wlfc_host_driver_definitions_h__ #define __wlfc_host_driver_definitions_h__ + + /* 16 bits will provide an absolute max of 65536 slots */ #define WLFC_HANGER_MAXITEMS 1024 @@ -134,7 +136,9 @@ typedef struct wlfc_mac_descriptor { */ uint suppress_count; /* flag. TRUE when in suppress state */ - uint8 suppressed; + uint8 suppressed; + uint8 deleting; + #ifdef PROP_TXSTATUS_DEBUG uint32 dstncredit_sent_packets; @@ -284,4 +288,15 @@ int dhd_wlfc_event(struct dhd_info *dhd); int dhd_os_wlfc_block(dhd_pub_t *pub); int dhd_os_wlfc_unblock(dhd_pub_t *pub); +void dhd_wlfc_dump(dhd_pub_t *dhdp, struct bcmstrbuf *strbuf); +int dhd_wlfc_init(dhd_pub_t *dhd); +void dhd_wlfc_deinit(dhd_pub_t *dhd); +int dhd_wlfc_suspend(dhd_pub_t *dhd); +int dhd_wlfc_resume(dhd_pub_t *dhd); +int dhd_wlfc_parse_header_info(dhd_pub_t *dhd, void* pktbuf, int tlv_hdr_len, + uchar *reorder_info_buf, uint *reorder_info_len); +int dhd_wlfc_commit_packets(void* state, f_commitpkt_t fcommit, + void* commit_ctx, void *pktbuf); +void dhd_wlfc_cleanup(dhd_pub_t *dhd, ifpkt_cb_t fn, int arg); +bool ifpkt_fn(void* p, int ifid); #endif /* __wlfc_host_driver_definitions_h__ */ diff --git a/drivers/net/wireless/bcmdhd/dngl_stats.h b/drivers/net/wireless/bcmdhd/dngl_stats.h index 5e5a2e2e531..0bc3b53f29e 100644 --- a/drivers/net/wireless/bcmdhd/dngl_stats.h +++ b/drivers/net/wireless/bcmdhd/dngl_stats.h @@ -2,7 +2,7 @@ * Common stats definitions for clients of dongle * ports * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd/dngl_wlhdr.h b/drivers/net/wireless/bcmdhd/dngl_wlhdr.h index 0e37df6e19e..d5eda8cb3ea 100644 --- a/drivers/net/wireless/bcmdhd/dngl_wlhdr.h +++ b/drivers/net/wireless/bcmdhd/dngl_wlhdr.h @@ -1,7 +1,7 @@ /* * Dongle WL Header definitions * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd/hndpmu.c b/drivers/net/wireless/bcmdhd/hndpmu.c index 92a56db94ad..e94fe802bdb 100644 --- a/drivers/net/wireless/bcmdhd/hndpmu.c +++ b/drivers/net/wireless/bcmdhd/hndpmu.c @@ -2,7 +2,7 @@ * Misc utility routines for accessing PMU corerev specific features * of the SiliconBackplane-based Broadcom chips. * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -22,7 +22,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: hndpmu.c 367414 2012-11-08 00:40:54Z $ + * $Id: hndpmu.c 414368 2013-07-24 15:00:23Z $ */ /* @@ -125,16 +125,54 @@ static const sdiod_drive_str_t sdiod_drive_strength_tab6_1v8[] = { {1, 0x1}, {0, 0x0} }; + +/* + * SDIO Drive Strength to sel value table for 43143 PMU Rev 17, see Confluence 43143 Toplevel + * architecture page, section 'PMU Chip Control 1 Register definition', click link to picture + * BCM43143_sel_sdio_signals.jpg. Valid after PMU Chip Control 0 Register, bit31 (override) has + * been written '1'. + */ +#if !defined(BCM_SDIO_VDDIO) || BCM_SDIO_VDDIO == 33 + +static const sdiod_drive_str_t sdiod_drive_strength_tab7_3v3[] = { + /* note: for 14, 10, 6 and 2mA hw timing is not met according to rtl team */ + {16, 0x7}, + {12, 0x5}, + {8, 0x3}, + {4, 0x1} }; /* note: 43143 does not support tristate */ + +#else + +static const sdiod_drive_str_t sdiod_drive_strength_tab7_1v8[] = { + /* note: for 7, 5, 3 and 1mA hw timing is not met according to rtl team */ + {8, 0x7}, + {6, 0x5}, + {4, 0x3}, + {2, 0x1} }; /* note: 43143 does not support tristate */ + +#endif /* BCM_SDIO_VDDIO */ + #define SDIOD_DRVSTR_KEY(chip, pmu) (((chip) << 16) | (pmu)) +/** + * Balance between stable SDIO operation and power consumption is achieved using this function. + * Note that each drive strength table is for a specific VDDIO of the SDIO pads, ideally this + * function should read the VDDIO itself to select the correct table. For now it has been solved + * with the 'BCM_SDIO_VDDIO' preprocessor constant. + * + * 'drivestrength': desired pad drive strength in mA. Drive strength of 0 requests tri-state (if + * hardware supports this), if no hw support drive strength is not programmed. + */ void si_sdiod_drive_strength_init(si_t *sih, osl_t *osh, uint32 drivestrength) { chipcregs_t *cc; uint origidx, intr_val = 0; sdiod_drive_str_t *str_tab = NULL; - uint32 str_mask = 0; + uint32 str_mask = 0; /* only alter desired bits in PMU chipcontrol 1 register */ uint32 str_shift = 0; + uint32 str_ovr_pmuctl = PMU_CHIPCTL0; /* PMU chipcontrol register containing override bit */ + uint32 str_ovr_pmuval = 0; /* position of bit within this register */ if (!(sih->cccaps & CC_CAP_PMU)) { return; @@ -182,10 +220,22 @@ si_sdiod_drive_strength_init(si_t *sih, osl_t *osh, uint32 drivestrength) str_mask = 0x00001800; str_shift = 11; break; + case SDIOD_DRVSTR_KEY(BCM43143_CHIP_ID, 17): +#if !defined(BCM_SDIO_VDDIO) || BCM_SDIO_VDDIO == 33 + if (drivestrength >= ARRAYLAST(sdiod_drive_strength_tab7_3v3)->strength) { + str_tab = (sdiod_drive_str_t *)&sdiod_drive_strength_tab7_3v3; + } +#else + if (drivestrength >= ARRAYLAST(sdiod_drive_strength_tab7_1v8)->strength) { + str_tab = (sdiod_drive_str_t *)&sdiod_drive_strength_tab7_1v8; + } +#endif /* BCM_SDIO_VDDIO */ + str_mask = 0x00000007; + str_ovr_pmuval = PMU43143_CC0_SDIO_DRSTR_OVR; + break; default: PMU_MSG(("No SDIO Drive strength init done for chip %s rev %d pmurev %d\n", bcm_chipname(sih->chip, chn, 8), sih->chiprev, sih->pmurev)); - break; } @@ -202,16 +252,19 @@ si_sdiod_drive_strength_init(si_t *sih, osl_t *osh, uint32 drivestrength) if (i > 0 && drivestrength > str_tab[i].strength) i--; - W_REG(osh, &cc->chipcontrol_addr, 1); + W_REG(osh, &cc->chipcontrol_addr, PMU_CHIPCTL1); cc_data_temp = R_REG(osh, &cc->chipcontrol_data); cc_data_temp &= ~str_mask; cc_data_temp |= str_tab[i].sel << str_shift; W_REG(osh, &cc->chipcontrol_data, cc_data_temp); - + if (str_ovr_pmuval) { /* enables the selected drive strength */ + W_REG(osh, &cc->chipcontrol_addr, str_ovr_pmuctl); + OR_REG(osh, &cc->chipcontrol_data, str_ovr_pmuval); + } PMU_MSG(("SDIO: %dmA drive strength requested; set to %dmA\n", drivestrength, str_tab[i].strength)); } /* Return to original core */ si_restore_core(sih, origidx, intr_val); -} +} /* si_sdiod_drive_strength_init */ diff --git a/drivers/net/wireless/bcmdhd/include/Makefile b/drivers/net/wireless/bcmdhd/include/Makefile index bcc1267755f..2ae584c97a9 100644 --- a/drivers/net/wireless/bcmdhd/include/Makefile +++ b/drivers/net/wireless/bcmdhd/include/Makefile @@ -51,3 +51,4 @@ clean: clean_all: clean clean_compvers .PHONY: all release clean epivers compvers clean_compvers + diff --git a/drivers/net/wireless/bcmdhd/include/aidmp.h b/drivers/net/wireless/bcmdhd/include/aidmp.h index 63513e6f6e2..55d823e3fd3 100644 --- a/drivers/net/wireless/bcmdhd/include/aidmp.h +++ b/drivers/net/wireless/bcmdhd/include/aidmp.h @@ -1,7 +1,7 @@ /* * Broadcom AMBA Interconnect definitions. * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -21,7 +21,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: aidmp.h 241182 2011-02-17 21:50:03Z $ + * $Id: aidmp.h 385510 2013-02-15 21:02:07Z $ */ #ifndef _AIDMP_H @@ -372,4 +372,15 @@ typedef volatile struct _aidmp { #define OOB_SEL_OUTEN_B_5 15 #define OOB_SEL_OUTEN_B_6 23 + +#define AI_OOBSEL_MASK 0x1F +#define AI_OOBSEL_0_SHIFT 0 +#define AI_OOBSEL_1_SHIFT 8 +#define AI_OOBSEL_2_SHIFT 16 +#define AI_OOBSEL_3_SHIFT 24 +#define AI_OOBSEL_4_SHIFT 0 +#define AI_OOBSEL_5_SHIFT 8 +#define AI_OOBSEL_6_SHIFT 16 +#define AI_OOBSEL_7_SHIFT 24 + #endif diff --git a/drivers/net/wireless/bcmdhd/include/bcm_cfg.h b/drivers/net/wireless/bcmdhd/include/bcm_cfg.h index a0610edf988..9153cd977b3 100644 --- a/drivers/net/wireless/bcmdhd/include/bcm_cfg.h +++ b/drivers/net/wireless/bcmdhd/include/bcm_cfg.h @@ -1,7 +1,7 @@ /* * BCM common config options * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd/include/bcm_mpool_pub.h b/drivers/net/wireless/bcmdhd/include/bcm_mpool_pub.h index 8fe3de7afb7..51a5de71254 100644 --- a/drivers/net/wireless/bcmdhd/include/bcm_mpool_pub.h +++ b/drivers/net/wireless/bcmdhd/include/bcm_mpool_pub.h @@ -35,7 +35,7 @@ * and instrumentation on top of the heap, without modifying the heap * allocation implementation. * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd/include/bcmcdc.h b/drivers/net/wireless/bcmdhd/include/bcmcdc.h index 9bae1c20a9b..999a0087946 100644 --- a/drivers/net/wireless/bcmdhd/include/bcmcdc.h +++ b/drivers/net/wireless/bcmdhd/include/bcmcdc.h @@ -4,7 +4,7 @@ * * Definitions subject to change without notice. * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd/include/bcmdefs.h b/drivers/net/wireless/bcmdhd/include/bcmdefs.h index 237d3ec1145..c95209302a5 100644 --- a/drivers/net/wireless/bcmdhd/include/bcmdefs.h +++ b/drivers/net/wireless/bcmdhd/include/bcmdefs.h @@ -1,7 +1,7 @@ /* * Misc system wide definitions * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -21,7 +21,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: bcmdefs.h 416262 2013-08-02 12:30:57Z $ + * $Id: bcmdefs.h 424298 2013-09-17 06:38:13Z $ */ #ifndef _bcmdefs_h_ @@ -187,8 +187,12 @@ typedef struct { #define BCMEXTRAHDROOM 260 #else +#if defined(BCM47XX_CA9) +#define BCMEXTRAHDROOM 224 +#else #define BCMEXTRAHDROOM 204 #endif +#endif #ifndef SDALIGN diff --git a/drivers/net/wireless/bcmdhd/include/bcmdevs.h b/drivers/net/wireless/bcmdhd/include/bcmdevs.h index 01762fde601..df1c3835e24 100644 --- a/drivers/net/wireless/bcmdhd/include/bcmdevs.h +++ b/drivers/net/wireless/bcmdhd/include/bcmdevs.h @@ -1,7 +1,7 @@ /* * Broadcom device-specific manifest constants. * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -21,7 +21,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: bcmdevs.h 368924 2012-11-15 08:12:59Z $ + * $Id: bcmdevs.h 444038 2013-12-18 09:35:07Z $ */ #ifndef _BCMDEVS_H @@ -137,6 +137,8 @@ #define BCM4330_D11N5G_ID 0x4362 #define BCM4336_D11N_ID 0x4343 #define BCM6362_D11N_ID 0x435f +#define BCM6362_D11N2G_ID 0x433f +#define BCM6362_D11N5G_ID 0x434f #define BCM4331_D11N_ID 0x4331 #define BCM4331_D11N2G_ID 0x4332 #define BCM4331_D11N5G_ID 0x4333 @@ -152,25 +154,25 @@ #define BCM43131_D11N2G_ID 0x43aa #define BCM4314_D11N2G_ID 0x4364 #define BCM43142_D11N2G_ID 0x4365 -#define BCM43143_D11N2G_ID 0x4366 +#define BCM43143_D11N2G_ID 0x4366 #define BCM4334_D11N_ID 0x4380 #define BCM4334_D11N2G_ID 0x4381 #define BCM4334_D11N5G_ID 0x4382 -#define BCM43342_D11N_ID 0x4383 -#define BCM43342_D11N2G_ID 0x4384 -#define BCM43342_D11N5G_ID 0x4385 -#define BCM43341_D11N_ID 0x4386 -#define BCM43341_D11N2G_ID 0x4387 -#define BCM43341_D11N5G_ID 0x4388 +#define BCM43342_D11N_ID 0x4383 +#define BCM43342_D11N2G_ID 0x4384 +#define BCM43342_D11N5G_ID 0x4385 +#define BCM43341_D11N_ID 0x4386 +#define BCM43341_D11N2G_ID 0x4387 +#define BCM43341_D11N5G_ID 0x4388 #define BCM4360_D11AC_ID 0x43a0 #define BCM4360_D11AC2G_ID 0x43a1 #define BCM4360_D11AC5G_ID 0x43a2 #define BCM4335_D11AC_ID 0x43ae #define BCM4335_D11AC2G_ID 0x43af #define BCM4335_D11AC5G_ID 0x43b0 -#define BCM4352_D11AC_ID 0x43b1 -#define BCM4352_D11AC2G_ID 0x43b2 -#define BCM4352_D11AC5G_ID 0x43b3 +#define BCM4352_D11AC_ID 0x43b1 +#define BCM4352_D11AC2G_ID 0x43b2 +#define BCM4352_D11AC5G_ID 0x43b3 #define BCM943228HMB_SSID_VEN1 0x0607 @@ -178,11 +180,11 @@ #define BCM94313HMG_SSID_VEN1 0x0609 #define BCM943142HM_SSID_VEN1 0x0611 -#define BCM43143_D11N2G_ID 0x4366 +#define BCM43143_D11N2G_ID 0x4366 -#define BCM43242_D11N_ID 0x4367 -#define BCM43242_D11N2G_ID 0x4368 -#define BCM43242_D11N5G_ID 0x4369 +#define BCM43242_D11N_ID 0x4367 +#define BCM43242_D11N2G_ID 0x4368 +#define BCM43242_D11N5G_ID 0x4369 #define BCM4350_D11AC_ID 0x43a3 #define BCM4350_D11AC2G_ID 0x43a4 @@ -225,8 +227,8 @@ #define BCM47XX_GIGETH_ID 0x471f #define BCM4712_MIPS_ID 0x4720 #define BCM4716_DEVICE_ID 0x4722 -#define BCM47XX_USB30H_ID 0x472a -#define BCM47XX_USB30D_ID 0x472b +#define BCM47XX_USB30H_ID 0x472a +#define BCM47XX_USB30D_ID 0x472b #define BCM47XX_SMBUS_EMU_ID 0x47fe #define BCM47XX_XOR_EMU_ID 0x47ff #define EPI41210_DEVICE_ID 0xa0fa @@ -282,26 +284,27 @@ #define BCM6362_CHIP_ID 0x6362 #define BCM4314_CHIP_ID 0x4314 #define BCM43142_CHIP_ID 43142 -#define BCM43143_CHIP_ID 43143 +#define BCM43143_CHIP_ID 43143 #define BCM4324_CHIP_ID 0x4324 #define BCM43242_CHIP_ID 43242 -#define BCM43243_CHIP_ID 43243 +#define BCM43243_CHIP_ID 43243 #define BCM4334_CHIP_ID 0x4334 -#define BCM4335_CHIP_ID 0x4335 +#define BCM4335_CHIP_ID 0x4335 +#define BCM4339_CHIP_ID 0x4339 #define BCM4360_CHIP_ID 0x4360 #define BCM4352_CHIP_ID 0x4352 #define BCM43526_CHIP_ID 0xAA06 -#define BCM43341_CHIP_ID 43341 -#define BCM43342_CHIP_ID 43342 -#define BCM4335_CHIP_ID 0x4335 -#define BCM4350_CHIP_ID 0x4350 +#define BCM43340_CHIP_ID 43340 +#define BCM43341_CHIP_ID 43341 +#define BCM43342_CHIP_ID 43342 +#define BCM4350_CHIP_ID 0x4350 #define BCM4342_CHIP_ID 4342 #define BCM4402_CHIP_ID 0x4402 #define BCM4704_CHIP_ID 0x4704 #define BCM4706_CHIP_ID 0x5300 -#define BCM4707_CHIP_ID 53010 -#define BCM53018_CHIP_ID 53018 +#define BCM4707_CHIP_ID 53010 +#define BCM53018_CHIP_ID 53018 #define BCM4707_CHIP(chipid) (((chipid) == BCM4707_CHIP_ID) || ((chipid) == BCM53018_CHIP_ID)) #define BCM4710_CHIP_ID 0x4710 #define BCM4712_CHIP_ID 0x4712 @@ -364,17 +367,17 @@ #define BCM4314SDIO_FPBGA_PKG_ID (8 | 4) #define BCM4314DEV_PKG_ID (8 | 6) -#define BCM4707_PKG_ID 1 -#define BCM4708_PKG_ID 2 -#define BCM4709_PKG_ID 0 +#define BCM4707_PKG_ID 1 +#define BCM4708_PKG_ID 2 +#define BCM4709_PKG_ID 0 #define PCIXX21_FLASHMEDIA0_ID 0x8033 #define PCIXX21_SDIOH0_ID 0x8034 -#define BCM4335_WLCSP_PKG_ID (0x0) -#define BCM4335_FCBGA_PKG_ID (0x1) -#define BCM4335_WLBGA_PKG_ID (0x2) -#define BCM4335_FCBGAD_PKG_ID (0x3) +#define BCM4335_WLCSP_PKG_ID (0x0) +#define BCM4335_FCBGA_PKG_ID (0x1) +#define BCM4335_WLBGA_PKG_ID (0x2) +#define BCM4335_FCBGAD_PKG_ID (0x3) #define BCM4335_PKG_MASK (0x3) @@ -389,7 +392,7 @@ #define BFL_CCKHIPWR 0x00000040 #define BFL_ENETADM 0x00000080 #define BFL_ENETVLAN 0x00000100 -#define BFL_LTECOEX 0x00000200 +#define BFL_LTECOEX 0x00000200 #define BFL_NOPCI 0x00000400 #define BFL_FEM 0x00000800 #define BFL_EXTLNA 0x00001000 @@ -404,7 +407,7 @@ #define BFL_PHASESHIFT 0x00100000 #define BFL_BUCKBOOST 0x00200000 #define BFL_FEM_BT 0x00400000 -#define BFL_RXCHAIN_OFF_BT 0x00400000 +#define BFL_RXCHAIN_OFF_BT 0x00400000 #define BFL_NOCBUCK 0x00800000 #define BFL_CCKFAVOREVM 0x01000000 #define BFL_PALDO 0x02000000 @@ -413,7 +416,7 @@ #define BFL_UCPWRCTL_MININDX 0x08000000 #define BFL_EXTLNA_5GHz 0x10000000 #define BFL_TRSW_1by2 0x20000000 -#define BFL_GAINBOOSTA01 0x20000000 +#define BFL_GAINBOOSTA01 0x20000000 #define BFL_LO_TRSW_R_5GHz 0x40000000 #define BFL_ELNA_GAINDEF 0x80000000 #define BFL_EXTLNA_TX 0x20000000 @@ -446,8 +449,8 @@ #define BFL2_ANAPACTRL_2G 0x00100000 #define BFL2_ANAPACTRL_5G 0x00200000 #define BFL2_ELNACTRL_TRSW_2G 0x00400000 -#define BFL2_BT_SHARE_ANT0 0x00800000 -#define BFL2_BT_SHARE_BM_BIT0 0x00800000 +#define BFL2_BT_SHARE_ANT0 0x00800000 +#define BFL2_BT_SHARE_BM_BIT0 0x00800000 #define BFL2_TEMPSENSE_HIGHER 0x01000000 #define BFL2_BTC3WIREONLY 0x02000000 #define BFL2_PWR_NOMINAL 0x04000000 @@ -455,31 +458,46 @@ #define BFL2_4313_RADIOREG 0x10000000 -#define BFL2_DYNAMIC_VMID 0x10000000 - -#define BFL2_SDR_EN 0x20000000 -#define BFL2_DYNAMIC_VMID 0x10000000 -#define BFL2_BT_SHARE_BM_BIT1 0x40000000 - - -#define BFL_SROM11_BTCOEX 0x00000001 -#define BFL_SROM11_WLAN_BT_SH_XTL 0x00000002 -#define BFL_SROM11_EXTLNA 0x00001000 -#define BFL_SROM11_EXTLNA_5GHz 0x10000000 -#define BFL_SROM11_GAINBOOSTA01 0x20000000 -#define BFL2_SROM11_APLL_WAR 0x00000002 -#define BFL2_SROM11_ANAPACTRL_2G 0x00100000 -#define BFL2_SROM11_ANAPACTRL_5G 0x00200000 - - -#define BFL3_FEMCTRL_SUB 0x00000007 -#define BFL3_RCAL_WAR 0x00000008 -#define BFL3_TXGAINTBLID 0x00000070 -#define BFL3_TXGAINTBLID_SHIFT 0x4 -#define BFL3_TSSI_DIV_WAR 0x00000080 -#define BFL3_TSSI_DIV_WAR_SHIFT 0x7 -#define BFL3_FEMTBL_FROM_NVRAM 0x00000100 -#define BFL3_FEMTBL_FROM_NVRAM_SHIFT 0x8 +#define BFL2_DYNAMIC_VMID 0x10000000 +#define BFL2_SDR_EN 0x20000000 +#define BFL2_LNA1BYPFORTR2G 0x40000000 +#define BFL2_LNA1BYPFORTR5G 0x80000000 + + +#define BFL_SROM11_BTCOEX 0x00000001 +#define BFL_SROM11_WLAN_BT_SH_XTL 0x00000002 +#define BFL_SROM11_EXTLNA 0x00001000 +#define BFL_SROM11_EXTLNA_5GHz 0x10000000 +#define BFL_SROM11_GAINBOOSTA01 0x20000000 +#define BFL2_SROM11_APLL_WAR 0x00000002 +#define BFL2_SROM11_ANAPACTRL_2G 0x00100000 +#define BFL2_SROM11_ANAPACTRL_5G 0x00200000 + + +#define BFL3_FEMCTRL_SUB 0x00000007 +#define BFL3_RCAL_WAR 0x00000008 +#define BFL3_TXGAINTBLID 0x00000070 +#define BFL3_TXGAINTBLID_SHIFT 0x4 +#define BFL3_TSSI_DIV_WAR 0x00000080 +#define BFL3_TSSI_DIV_WAR_SHIFT 0x7 +#define BFL3_FEMTBL_FROM_NVRAM 0x00000100 +#define BFL3_FEMTBL_FROM_NVRAM_SHIFT 0x8 +#define BFL3_AGC_CFG_2G 0x00000200 +#define BFL3_AGC_CFG_5G 0x00000400 +#define BFL3_PPR_BIT_EXT 0x00000800 +#define BFL3_PPR_BIT_EXT_SHIFT 11 +#define BFL3_BBPLL_SPR_MODE_DIS 0x00001000 +#define BFL3_RCAL_OTP_VAL_EN 0x00002000 +#define BFL3_2GTXGAINTBL_BLANK 0x00004000 +#define BFL3_2GTXGAINTBL_BLANK_SHIFT 14 +#define BFL3_5GTXGAINTBL_BLANK 0x00008000 +#define BFL3_5GTXGAINTBL_BLANK_SHIFT 15 +#define BFL3_BT_SHARE_BM_BIT1 0x40000000 +#define BFL3_PHASETRACK_MAX_ALPHABETA 0x00010000 +#define BFL3_PHASETRACK_MAX_ALPHABETA_SHIFT 16 +#define BFL3_BT_SHARE_BM_BIT1 0x40000000 +#define BFL3_EN_NONBRCM_TXBF 0x10000000 +#define BFL3_EN_P2PLINK_TXBF 0x20000000 #define BOARD_GPIO_BTC3W_IN 0x850 @@ -545,6 +563,8 @@ #define RDL_RAM_BASE_43242 0x60000000 #define RDL_RAM_SIZE_43143 0x70000 #define RDL_RAM_BASE_43143 0x60000000 +#define RDL_RAM_SIZE_4350 0xC0000 +#define RDL_RAM_BASE_4350 0x180800 #define MUXENAB_UART 0x00000001 diff --git a/drivers/net/wireless/bcmdhd/include/bcmendian.h b/drivers/net/wireless/bcmdhd/include/bcmendian.h index 22eb7dbcb95..650969886d8 100644 --- a/drivers/net/wireless/bcmdhd/include/bcmendian.h +++ b/drivers/net/wireless/bcmdhd/include/bcmendian.h @@ -1,7 +1,7 @@ /* * Byte order utilities * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd/include/bcmnvram.h b/drivers/net/wireless/bcmdhd/include/bcmnvram.h index 653dd773170..dbfc3b4597c 100644 --- a/drivers/net/wireless/bcmdhd/include/bcmnvram.h +++ b/drivers/net/wireless/bcmdhd/include/bcmnvram.h @@ -1,7 +1,7 @@ /* * NVRAM variable manipulation * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -21,7 +21,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: bcmnvram.h 364705 2012-10-25 00:42:42Z $ + * $Id: bcmnvram.h 371859 2012-11-29 18:19:30Z $ */ #ifndef _bcmnvram_h_ @@ -102,6 +102,9 @@ extern int nvram_set(const char *name, const char *value); extern int nvram_unset(const char *name); +extern int nvram_commit_internal(bool nvram_corrupt); + + extern int nvram_commit(void); @@ -129,7 +132,7 @@ extern int nvram_space; #endif #define MAX_NVRAM_SPACE NVRAM_SPACE #define ROM_ENVRAM_SPACE 0x1000 -#define NVRAM_LZMA_MAGIC 0x4c5a4d41 +#define NVRAM_LZMA_MAGIC 0x4c5a4d41 #define NVRAM_MAX_VALUE_LEN 255 #define NVRAM_MAX_PARAM_LEN 64 diff --git a/drivers/net/wireless/bcmdhd/include/bcmpcispi.h b/drivers/net/wireless/bcmdhd/include/bcmpcispi.h index 44b263cec6a..53bd7fceaa1 100644 --- a/drivers/net/wireless/bcmdhd/include/bcmpcispi.h +++ b/drivers/net/wireless/bcmdhd/include/bcmpcispi.h @@ -1,7 +1,7 @@ /* * Broadcom PCI-SPI Host Controller Register Definitions * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd/include/bcmperf.h b/drivers/net/wireless/bcmdhd/include/bcmperf.h index 74383076889..fad33ffa245 100644 --- a/drivers/net/wireless/bcmdhd/include/bcmperf.h +++ b/drivers/net/wireless/bcmdhd/include/bcmperf.h @@ -1,7 +1,7 @@ /* * Performance counters software interface. * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd/include/bcmsdbus.h b/drivers/net/wireless/bcmdhd/include/bcmsdbus.h index cbea8c5c13b..3abf49383dd 100644 --- a/drivers/net/wireless/bcmdhd/include/bcmsdbus.h +++ b/drivers/net/wireless/bcmdhd/include/bcmsdbus.h @@ -2,7 +2,7 @@ * Definitions for API from sdio common code (bcmsdh) to individual * host controller drivers. * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -22,7 +22,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: bcmsdbus.h 387188 2013-02-24 09:20:24Z $ + * $Id: bcmsdbus.h 408155 2013-06-17 21:52:27Z $ */ #ifndef _sdio_api_h_ @@ -49,9 +49,9 @@ #ifdef BCMSDIOH_TXGLOM /* Max number of glommed pkts */ #ifdef CUSTOM_MAX_TXGLOM_SIZE -#define SDPCM_MAXGLOM_SIZE CUSTOM_MAX_TXGLOM_SIZE +#define SDPCM_MAXGLOM_SIZE CUSTOM_MAX_TXGLOM_SIZE #else -#define SDPCM_MAXGLOM_SIZE 16 +#define SDPCM_MAXGLOM_SIZE 10 #endif /* CUSTOM_MAX_TXGLOM_SIZE */ #define SDPCM_TXGLOM_CPY 0 /* SDIO 2.0 should use copy mode */ @@ -59,17 +59,22 @@ #ifdef BCMSDIOH_TXGLOM_HIGHSPEED #define SDPCM_DEFGLOM_MODE SDPCM_TXGLOM_MDESC -#ifdef CUSTOM_TXGLOM_SIZE -#define SDPCM_DEFGLOM_SIZE CUSTOM_TXGLOM_SIZE +#ifdef CUSTOM_DEF_TXGLOM_SIZE +#define SDPCM_DEFGLOM_SIZE CUSTOM_DEF_TXGLOM_SIZE #else #define SDPCM_DEFGLOM_SIZE 10 -#endif +#endif /* CUSTOM_DEF_TXGLOM_SIZE */ #else #define SDPCM_DEFGLOM_MODE SDPCM_TXGLOM_CPY #define SDPCM_DEFGLOM_SIZE 3 #endif /* BCMSDIOH_TXGLOM_HIGHSPEED */ -#endif /* BCMSDIOH_TXGLOM */ +#if SDPCM_DEFGLOM_SIZE > SDPCM_MAXGLOM_SIZE +#warning "SDPCM_DEFGLOM_SIZE cannot be higher than SDPCM_MAXGLOM_SIZE!!" +#undef SDPCM_DEFGLOM_SIZE +#define SDPCM_DEFGLOM_SIZE SDPCM_MAXGLOM_SIZE +#endif +#endif /* BCMSDIOH_TXGLOM */ typedef int SDIOH_API_RC; diff --git a/drivers/net/wireless/bcmdhd/include/bcmsdh.h b/drivers/net/wireless/bcmdhd/include/bcmsdh.h index e882d5e628e..657a69ebaa3 100644 --- a/drivers/net/wireless/bcmdhd/include/bcmsdh.h +++ b/drivers/net/wireless/bcmdhd/include/bcmsdh.h @@ -3,7 +3,7 @@ * export functions to client drivers * abstract OS and BUS specific details of SDIO * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -23,7 +23,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: bcmsdh.h 365575 2012-10-30 05:25:07Z $ + * $Id: bcmsdh.h 414953 2013-07-26 17:36:27Z $ */ /** @@ -57,13 +57,7 @@ extern struct device *pm_dev; * implementation may maintain a single "default" handle (e.g. the first or * most recent one) to enable single-instance implementations to pass NULL. */ - -#if 0 && (NDISVER >= 0x0630) && 1 -extern bcmsdh_info_t *bcmsdh_attach(osl_t *osh, void *cfghdl, - void **regsva, uint irq, shared_info_t *sh); -#else extern bcmsdh_info_t *bcmsdh_attach(osl_t *osh, void *cfghdl, void **regsva, uint irq); -#endif /* Detach - freeup resources allocated in attach */ extern int bcmsdh_detach(osl_t *osh, void *sdh); @@ -221,6 +215,7 @@ extern void bcmsdh_unreg_sdio_notify(void); extern int bcmsdh_register_oob_intr(void * dhdp); extern void bcmsdh_unregister_oob_intr(void); extern void bcmsdh_oob_intr_set(bool enable); +extern bool bcmsdh_is_oob_intr_registered(void); #endif /* defined(OOB_INTR_ONLY) || defined(BCMSPI_ANDROID) */ /* Function to pass device-status bits to DHD. */ diff --git a/drivers/net/wireless/bcmdhd/include/bcmsdh_sdmmc.h b/drivers/net/wireless/bcmdhd/include/bcmsdh_sdmmc.h index 98e1ff0fc9c..9e059697309 100644 --- a/drivers/net/wireless/bcmdhd/include/bcmsdh_sdmmc.h +++ b/drivers/net/wireless/bcmdhd/include/bcmsdh_sdmmc.h @@ -1,7 +1,7 @@ /* * BCMSDH Function Driver for the native SDIO/MMC driver in the Linux Kernel * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -21,7 +21,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: bcmsdh_sdmmc.h 396591 2013-04-13 16:14:29Z $ + * $Id: bcmsdh_sdmmc.h 396592 2013-04-13 16:14:38Z $ */ #ifndef __BCMSDH_SDMMC_H__ @@ -67,15 +67,13 @@ extern void sdioh_sdmmc_osfree(sdioh_info_t *sd); #define CLIENT_INTR 0x100 /* Get rid of this! */ #ifdef BCMSDIOH_TXGLOM -/* Setting the MAX limit to 10 */ -#define SDIOH_MAXGLOM_SIZE 16 typedef struct glom_buf { void *glom_pkt_head; void *glom_pkt_tail; uint32 count; /* Total number of pkts queued */ } glom_buf_t; -#endif +#endif /* BCMSDIOH_TXGLOM */ struct sdioh_info { osl_t *osh; /* osh handler */ diff --git a/drivers/net/wireless/bcmdhd/include/bcmsdpcm.h b/drivers/net/wireless/bcmdhd/include/bcmsdpcm.h index 1fc37f90605..4ebe3d70929 100644 --- a/drivers/net/wireless/bcmdhd/include/bcmsdpcm.h +++ b/drivers/net/wireless/bcmdhd/include/bcmsdpcm.h @@ -2,7 +2,7 @@ * Broadcom SDIO/PCMCIA * Software-specific definitions shared between device and host side * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd/include/bcmsdspi.h b/drivers/net/wireless/bcmdhd/include/bcmsdspi.h index 3d444f3ba26..21792abca73 100644 --- a/drivers/net/wireless/bcmdhd/include/bcmsdspi.h +++ b/drivers/net/wireless/bcmdhd/include/bcmsdspi.h @@ -1,7 +1,7 @@ /* * SD-SPI Protocol Conversion - BCMSDH->SPI Translation Layer * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd/include/bcmsdstd.h b/drivers/net/wireless/bcmdhd/include/bcmsdstd.h index 1fa2e84f7a7..09628562957 100644 --- a/drivers/net/wireless/bcmdhd/include/bcmsdstd.h +++ b/drivers/net/wireless/bcmdhd/include/bcmsdstd.h @@ -1,7 +1,7 @@ /* * 'Standard' SDIO HOST CONTROLLER driver * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -21,7 +21,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: bcmsdstd.h 372377 2012-12-03 12:24:59Z $ + * $Id: bcmsdstd.h 343301 2012-07-06 13:07:32Z $ */ #ifndef _BCM_SD_STD_H #define _BCM_SD_STD_H diff --git a/drivers/net/wireless/bcmdhd/include/bcmspi.h b/drivers/net/wireless/bcmdhd/include/bcmspi.h index e226cb10229..e81ea62524b 100644 --- a/drivers/net/wireless/bcmdhd/include/bcmspi.h +++ b/drivers/net/wireless/bcmdhd/include/bcmspi.h @@ -1,7 +1,7 @@ /* * Broadcom SPI Low-Level Hardware Driver API * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd/include/bcmspibrcm.h b/drivers/net/wireless/bcmdhd/include/bcmspibrcm.h index a3e9b49a060..b014046d2ab 100644 --- a/drivers/net/wireless/bcmdhd/include/bcmspibrcm.h +++ b/drivers/net/wireless/bcmdhd/include/bcmspibrcm.h @@ -1,7 +1,7 @@ /* * SD-SPI Protocol Conversion - BCMSDH->gSPI Translation Layer * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -21,7 +21,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: bcmspibrcm.h 358377 2012-09-23 11:30:22Z $ + * $Id: bcmspibrcm.h 373331 2012-12-07 04:46:22Z $ */ #ifndef _BCM_SPI_BRCM_H #define _BCM_SPI_BRCM_H @@ -80,19 +80,15 @@ struct sdioh_info { #endif /* !BCMSPI_ANDROID */ osl_t *osh; /* osh handler */ void *controller; /* Pointer to SPI Controller's private data struct */ -#ifndef BCMSPI_ANDROID uint lockcount; /* nest count of spi_lock() calls */ bool client_intr_enabled; /* interrupt connnected flag */ bool intr_handler_valid; /* client driver interrupt handler valid */ sdioh_cb_fn_t intr_handler; /* registered interrupt handler */ void *intr_handler_arg; /* argument to call interrupt handler */ -#endif /* !BCMSPI_ANDROID */ bool initialized; /* card initialized */ uint32 target_dev; /* Target device ID */ uint32 intmask; /* Current active interrupts */ -#ifndef BCMSPI_ANDROID void *sdos_info; /* Pointer to per-OS private data */ -#endif /* !BCMSPI_ANDROID */ uint32 controller_type; /* Host controller type */ uint8 version; /* Host Controller Spec Compliance Version */ uint irq; /* Client irq */ diff --git a/drivers/net/wireless/bcmdhd/include/bcmsrom_fmt.h b/drivers/net/wireless/bcmdhd/include/bcmsrom_fmt.h index 0347674ce15..aaf8a0a388b 100644 --- a/drivers/net/wireless/bcmdhd/include/bcmsrom_fmt.h +++ b/drivers/net/wireless/bcmdhd/include/bcmsrom_fmt.h @@ -1,7 +1,7 @@ /* * SROM format definition. * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -21,7 +21,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: bcmsrom_fmt.h 361510 2012-10-09 00:15:04Z $ + * $Id: bcmsrom_fmt.h 381260 2013-01-25 22:07:55Z $ */ #ifndef _bcmsrom_fmt_h_ @@ -454,8 +454,10 @@ #define SROM11_MPWR_RAWTS 88 #define SROM11_TS_SLP_OPT_CORRX 89 #define SROM11_XTAL_FREQ 90 +#define SROM11_5GB0_4080_W0_A1 91 #define SROM11_PHYCAL_TEMPDELTA 92 #define SROM11_MPWR_1_AND_2 93 +#define SROM11_5GB0_4080_W1_A1 94 /* Masks and offsets for Terrmal parameters */ #define SROM11_TEMPS_PERIOD_MASK 0xf0 @@ -476,13 +478,15 @@ #define SROM11_PDOFF_2G_40M_VALID_MASK 0x8000 #define SROM11_PDOFF_2G_40M_VALID_SHIFT 15 -#define SROM11_PDOFF_2G_40M 100 +#define SROM11_PDOFF_2G_40M 100 #define SROM11_PDOFF_40M_A0 101 #define SROM11_PDOFF_40M_A1 102 #define SROM11_PDOFF_40M_A2 103 +#define SROM11_5GB0_4080_W2_A1 103 #define SROM11_PDOFF_80M_A0 104 #define SROM11_PDOFF_80M_A1 105 #define SROM11_PDOFF_80M_A2 106 +#define SROM11_5GB1_4080_W0_A1 106 #define SROM11_SUBBAND5GVER 107 @@ -493,9 +497,12 @@ #define SROM11_PATH2 148 #define SROM11_2G_MAXP 0 +#define SROM11_5GB1_4080_PA 0 #define SROM11_2G_PA 1 +#define SROM11_5GB2_4080_PA 2 #define SROM11_RXGAINS1 4 #define SROM11_RXGAINS 5 +#define SROM11_5GB3_4080_PA 5 #define SROM11_5GB1B0_MAXP 6 #define SROM11_5GB3B2_MAXP 7 #define SROM11_5GB0_PA 8 @@ -576,8 +583,10 @@ #define SROM11_SB20IN40LRPO 210 #define SROM11_SB20IN80AND160LR5GLPO 211 #define SROM11_SB40AND80LR5GLPO 212 +#define SROM11_TXIDXCAP2G 212 #define SROM11_SB20IN80AND160LR5GMPO 213 #define SROM11_SB40AND80LR5GMPO 214 +#define SROM11_TXIDXCAP5G 214 #define SROM11_SB20IN80AND160LR5GHPO 215 #define SROM11_SB40AND80LR5GHPO 216 diff --git a/drivers/net/wireless/bcmdhd/include/bcmsrom_tbl.h b/drivers/net/wireless/bcmdhd/include/bcmsrom_tbl.h index 8e8bf47b722..ad46257214a 100644 --- a/drivers/net/wireless/bcmdhd/include/bcmsrom_tbl.h +++ b/drivers/net/wireless/bcmdhd/include/bcmsrom_tbl.h @@ -1,7 +1,7 @@ /* * Table that encodes the srom formats for PCI/PCIe NICs. * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -21,7 +21,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: bcmsrom_tbl.h 368874 2012-11-15 02:39:03Z $ + * $Id: bcmsrom_tbl.h 381260 2013-01-25 22:07:55Z $ */ #ifndef _bcmsrom_tbl_h_ @@ -69,7 +69,7 @@ static const sromvar_t pci_sromvars[] = { {"devid", 0xffffff00, SRFL_PRHEX, PCI_F0DEVID, 0xffff}, #else {"devid", 0xffffff00, SRFL_PRHEX|SRFL_NOVAR, PCI_F0DEVID, 0xffff}, -#endif +#endif {"boardrev", 0x0000000e, SRFL_PRHEX, SROM_AABREV, SROM_BR_MASK}, {"boardrev", 0x000000f0, SRFL_PRHEX, SROM4_BREV, 0xffff}, {"boardrev", 0xffffff00, SRFL_PRHEX, SROM8_BREV, 0xffff}, @@ -494,7 +494,20 @@ static const sromvar_t pci_sromvars[] = { {"tempsense_slope", 0xfffff800, SRFL_PRHEX, SROM11_TS_SLP_OPT_CORRX, 0x00ff}, {"tempcorrx", 0xfffff800, SRFL_PRHEX, SROM11_TS_SLP_OPT_CORRX, 0xfc00}, {"tempsense_option", 0xfffff800, SRFL_PRHEX, SROM11_TS_SLP_OPT_CORRX, 0x0300}, - {"xtalfreq", 0xfffff800, 0, SROM11_XTAL_FREQ, 0xffff}, + {"xtalfreq", 0xfffff800, 0, SROM11_XTAL_FREQ, 0xffff}, + /* Special PA Params for 4350 5G Band, 40/80 MHz BW Ant #1 */ + {"pa5gbw4080a1", 0xfffff800, SRFL_PRHEX | SRFL_ARRAY, SROM11_5GB0_4080_W0_A1, 0xffff}, + {"", 0xfffff800, SRFL_PRHEX | SRFL_ARRAY, SROM11_5GB0_4080_W1_A1, 0xffff}, + {"", 0xfffff800, SRFL_PRHEX | SRFL_ARRAY, SROM11_5GB0_4080_W2_A1, 0xffff}, + {"", 0xfffff800, SRFL_PRHEX | SRFL_ARRAY, SROM11_5GB1_4080_W0_A1, 0xffff}, + {"", 0xfffff800, SRFL_PRHEX | SRFL_ARRAY, SROM11_PATH2 + SROM11_5GB1_4080_PA, 0xffff}, + {"", 0xfffff800, SRFL_PRHEX | SRFL_ARRAY, SROM11_PATH2 + SROM11_5GB1_4080_PA + 1, 0xffff}, + {"", 0xfffff800, SRFL_PRHEX | SRFL_ARRAY, SROM11_PATH2 + SROM11_5GB2_4080_PA, 0xffff}, + {"", 0xfffff800, SRFL_PRHEX | SRFL_ARRAY, SROM11_PATH2 + SROM11_5GB2_4080_PA + 1, 0xffff}, + {"", 0xfffff800, SRFL_PRHEX | SRFL_ARRAY, SROM11_PATH2 + SROM11_5GB2_4080_PA + 2, 0xffff}, + {"", 0xfffff800, SRFL_PRHEX | SRFL_ARRAY, SROM11_PATH2 + SROM11_5GB3_4080_PA, 0xffff}, + {"", 0xfffff800, SRFL_PRHEX | SRFL_ARRAY, SROM11_PATH2 + SROM11_5GB3_4080_PA + 1, 0xffff}, + {"", 0xfffff800, SRFL_PRHEX, SROM11_PATH2 + SROM11_5GB3_4080_PA + 2, 0xffff}, {"phycal_tempdelta", 0xfffff800, 0, SROM11_PHYCAL_TEMPDELTA, 0x00ff}, {"temps_period", 0xfffff800, 0, SROM11_PHYCAL_TEMPDELTA, 0x0f00}, {"temps_hysteresis", 0xfffff800, 0, SROM11_PHYCAL_TEMPDELTA, 0xf000}, @@ -513,6 +526,50 @@ static const sromvar_t pci_sromvars[] = { {"pdoffset80ma2", 0xfffff800, 0, SROM11_PDOFF_80M_A2, 0xffff}, {"subband5gver", 0xfffff800, SRFL_PRHEX, SROM11_SUBBAND5GVER, 0xffff}, + {"paparambwver", 0xfffff800, 0, SROM11_MCSLR5GLPO, 0xf000}, + /* Special PA Params for 4350 5G Band, 40/80 MHz BW Ant #0 */ + {"pa5gbw4080a0", 0xfffff800, SRFL_PRHEX | SRFL_ARRAY, SROM11_PATH2 +SROM11_5GB0_PA, 0xffff}, + {"", 0xfffff800, SRFL_PRHEX | SRFL_ARRAY, SROM11_PATH2 + SROM11_5GB0_PA + 1, 0xffff}, + {"", 0xfffff800, SRFL_PRHEX | SRFL_ARRAY, SROM11_PATH2 + SROM11_5GB0_PA + 2, 0xffff}, + {"", 0xfffff800, SRFL_PRHEX | SRFL_ARRAY, SROM11_PATH2 + SROM11_5GB1_PA, 0xffff}, + {"", 0xfffff800, SRFL_PRHEX | SRFL_ARRAY, SROM11_PATH2 + SROM11_5GB1_PA + 1, 0xffff}, + {"", 0xfffff800, SRFL_PRHEX | SRFL_ARRAY, SROM11_PATH2 + SROM11_5GB1_PA + 2, 0xffff}, + {"", 0xfffff800, SRFL_PRHEX | SRFL_ARRAY, SROM11_PATH2 + SROM11_5GB2_PA, 0xffff}, + {"", 0xfffff800, SRFL_PRHEX | SRFL_ARRAY, SROM11_PATH2 + SROM11_5GB2_PA + 1, 0xffff}, + {"", 0xfffff800, SRFL_PRHEX | SRFL_ARRAY, SROM11_PATH2 + SROM11_5GB2_PA + 2, 0xffff}, + {"", 0xfffff800, SRFL_PRHEX | SRFL_ARRAY, SROM11_PATH2 + SROM11_5GB3_PA, 0xffff}, + {"", 0xfffff800, SRFL_PRHEX | SRFL_ARRAY, SROM11_PATH2 + SROM11_5GB3_PA + 1, 0xffff}, + {"", 0xfffff800, SRFL_PRHEX, SROM11_PATH2 + SROM11_5GB3_PA + 2, 0xffff}, + /* Special PA Params for 4335 5G Band, 40 MHz BW */ + {"pa5gbw40a0", 0xfffff800, SRFL_PRHEX | SRFL_ARRAY, SROM11_PATH1 + SROM11_5GB0_PA, 0xffff}, + {"", 0xfffff800, SRFL_PRHEX | SRFL_ARRAY, SROM11_PATH1 + SROM11_5GB0_PA + 1, 0xffff}, + {"", 0xfffff800, SRFL_PRHEX | SRFL_ARRAY, SROM11_PATH1 + SROM11_5GB0_PA + 2, 0xffff}, + {"", 0xfffff800, SRFL_PRHEX | SRFL_ARRAY, SROM11_PATH1 + SROM11_5GB1_PA, 0xffff}, + {"", 0xfffff800, SRFL_PRHEX | SRFL_ARRAY, SROM11_PATH1 + SROM11_5GB1_PA + 1, 0xffff}, + {"", 0xfffff800, SRFL_PRHEX | SRFL_ARRAY, SROM11_PATH1 + SROM11_5GB1_PA + 2, 0xffff}, + {"", 0xfffff800, SRFL_PRHEX | SRFL_ARRAY, SROM11_PATH1 + SROM11_5GB2_PA, 0xffff}, + {"", 0xfffff800, SRFL_PRHEX | SRFL_ARRAY, SROM11_PATH1 + SROM11_5GB2_PA + 1, 0xffff}, + {"", 0xfffff800, SRFL_PRHEX | SRFL_ARRAY, SROM11_PATH1 + SROM11_5GB2_PA + 2, 0xffff}, + {"", 0xfffff800, SRFL_PRHEX | SRFL_ARRAY, SROM11_PATH1 + SROM11_5GB3_PA, 0xffff}, + {"", 0xfffff800, SRFL_PRHEX | SRFL_ARRAY, SROM11_PATH1 + SROM11_5GB3_PA + 1, 0xffff}, + {"", 0xfffff800, SRFL_PRHEX, SROM11_PATH1 + SROM11_5GB3_PA + 2, 0xffff}, + /* Special PA Params for 4335 5G Band, 80 MHz BW */ + {"pa5gbw80a0", 0xfffff800, SRFL_PRHEX | SRFL_ARRAY, SROM11_PATH2 + SROM11_5GB0_PA, 0xffff}, + {"", 0xfffff800, SRFL_PRHEX | SRFL_ARRAY, SROM11_PATH2 + SROM11_5GB0_PA + 1, 0xffff}, + {"", 0xfffff800, SRFL_PRHEX | SRFL_ARRAY, SROM11_PATH2 + SROM11_5GB0_PA + 2, 0xffff}, + {"", 0xfffff800, SRFL_PRHEX | SRFL_ARRAY, SROM11_PATH2 + SROM11_5GB1_PA, 0xffff}, + {"", 0xfffff800, SRFL_PRHEX | SRFL_ARRAY, SROM11_PATH2 + SROM11_5GB1_PA + 1, 0xffff}, + {"", 0xfffff800, SRFL_PRHEX | SRFL_ARRAY, SROM11_PATH2 + SROM11_5GB1_PA + 2, 0xffff}, + {"", 0xfffff800, SRFL_PRHEX | SRFL_ARRAY, SROM11_PATH2 + SROM11_5GB2_PA, 0xffff}, + {"", 0xfffff800, SRFL_PRHEX | SRFL_ARRAY, SROM11_PATH2 + SROM11_5GB2_PA + 1, 0xffff}, + {"", 0xfffff800, SRFL_PRHEX | SRFL_ARRAY, SROM11_PATH2 + SROM11_5GB2_PA + 2, 0xffff}, + {"", 0xfffff800, SRFL_PRHEX | SRFL_ARRAY, SROM11_PATH2 + SROM11_5GB3_PA, 0xffff}, + {"", 0xfffff800, SRFL_PRHEX | SRFL_ARRAY, SROM11_PATH2 + SROM11_5GB3_PA + 1, 0xffff}, + {"", 0xfffff800, SRFL_PRHEX, SROM11_PATH2 + SROM11_5GB3_PA + 2, 0xffff}, + /* Special PA Params for 4335 2G Band, CCK */ + {"pa2gccka0", 0xfffff800, SRFL_PRHEX | SRFL_ARRAY, SROM11_PATH1 + SROM11_2G_PA, 0xffff}, + {"", 0xfffff800, SRFL_PRHEX | SRFL_ARRAY, SROM11_PATH1 + SROM11_2G_PA + 1, 0xffff}, + {"", 0xfffff800, SRFL_PRHEX, SROM11_PATH1 + SROM11_2G_PA + 2, 0xffff}, /* power per rate */ {"cckbw202gpo", 0xfffff800, 0, SROM11_CCKBW202GPO, 0xffff}, @@ -541,10 +598,10 @@ static const sromvar_t pci_sromvars[] = { {"", 0xfffff800, 0, SROM11_MCSBW405GHPO_1, 0xffff}, {"mcsbw805ghpo", 0xfffff800, SRFL_MORE, SROM11_MCSBW805GHPO, 0xffff}, {"", 0xfffff800, 0, SROM11_MCSBW805GHPO_1, 0xffff}, - {"mcslr5glpo", 0xfffff800, 0, SROM11_MCSLR5GLPO, 0xffff}, + {"mcslr5glpo", 0xfffff800, 0, SROM11_MCSLR5GLPO, 0x0fff}, {"mcslr5gmpo", 0xfffff800, 0, SROM11_MCSLR5GMPO, 0xffff}, {"mcslr5ghpo", 0xfffff800, 0, SROM11_MCSLR5GHPO, 0xffff}, - {"sb20in40hrpo", 0xfffff800, 0, SROM11_SB20IN40HRPO, 0xffff}, + {"sb20in40hrpo", 0xfffff800, 0, SROM11_SB20IN40HRPO, 0xffff}, {"sb20in80and160hr5glpo", 0xfffff800, 0, SROM11_SB20IN80AND160HR5GLPO, 0xffff}, {"sb40and80hr5glpo", 0xfffff800, 0, SROM11_SB40AND80HR5GLPO, 0xffff}, {"sb20in80and160hr5gmpo", 0xfffff800, 0, SROM11_SB20IN80AND160HR5GMPO, 0xffff}, @@ -596,11 +653,13 @@ static const sromvar_t pci_sromvars[] = { {"", 0xfffff800, SRFL_ARRAY, SROM11_RXGAINERR_5GM, 0xf800}, {"", 0xfffff800, SRFL_ARRAY, SROM11_RXGAINERR_5GH, 0xf800}, {"", 0xfffff800, 0, SROM11_RXGAINERR_5GU, 0xf800}, - {"rpcal2g", 0xfffff800, 0, SROM11_RPCAL_2G, 0xffff}, - {"rpcal5gb0", 0xfffff800, 0, SROM11_RPCAL_5GL, 0xffff}, - {"rpcal5gb1", 0xfffff800, 0, SROM11_RPCAL_5GM, 0xffff}, - {"rpcal5gb2", 0xfffff800, 0, SROM11_RPCAL_5GH, 0xffff}, - {"rpcal5gb3", 0xfffff800, 0, SROM11_RPCAL_5GU, 0xffff}, + {"rpcal2g", 0xfffff800, 0, SROM11_RPCAL_2G, 0xffff}, + {"rpcal5gb0", 0xfffff800, 0, SROM11_RPCAL_5GL, 0xffff}, + {"rpcal5gb1", 0xfffff800, 0, SROM11_RPCAL_5GM, 0xffff}, + {"rpcal5gb2", 0xfffff800, 0, SROM11_RPCAL_5GH, 0xffff}, + {"rpcal5gb3", 0xfffff800, 0, SROM11_RPCAL_5GU, 0xffff}, + {"txidxcap2g", 0xfffff800, 0, SROM11_TXIDXCAP2G, 0x0ff0}, + {"txidxcap5g", 0xfffff800, 0, SROM11_TXIDXCAP5G, 0x0ff0}, {NULL, 0, 0, 0, 0} }; @@ -744,6 +803,30 @@ static const pavars_t pavars[] = { {PHY_TYPE_NULL, 0, 0, ""} }; +/* pavars table when paparambwver is 1 */ +static const pavars_t pavars_bwver_1[] = { + /* ACPHY */ + {PHY_TYPE_AC, WL_CHAN_FREQ_RANGE_2G, 0, "pa2ga0"}, + {PHY_TYPE_AC, WL_CHAN_FREQ_RANGE_2G, 1, "pa2gccka0"}, + {PHY_TYPE_AC, WL_CHAN_FREQ_RANGE_2G, 1, "pa2ga2"}, + {PHY_TYPE_AC, WL_CHAN_FREQ_RANGE_5G_4BAND, 0, "pa5ga0"}, + {PHY_TYPE_AC, WL_CHAN_FREQ_RANGE_5G_4BAND, 1, "pa5gbw40a0"}, + {PHY_TYPE_AC, WL_CHAN_FREQ_RANGE_5G_4BAND, 2, "pa5gbw80a0"}, + {PHY_TYPE_NULL, 0, 0, ""} +}; + +/* pavars table when paparambwver is 2 */ +static const pavars_t pavars_bwver_2[] = { + /* ACPHY */ + {PHY_TYPE_AC, WL_CHAN_FREQ_RANGE_2G, 0, "pa2ga0"}, + {PHY_TYPE_AC, WL_CHAN_FREQ_RANGE_2G, 1, "pa2ga1"}, + {PHY_TYPE_AC, WL_CHAN_FREQ_RANGE_5G_4BAND, 0, "pa5ga0"}, + {PHY_TYPE_AC, WL_CHAN_FREQ_RANGE_5G_4BAND, 1, "pa5ga1"}, + {PHY_TYPE_AC, WL_CHAN_FREQ_RANGE_5G_4BAND, 2, "pa5gbw4080a0"}, + {PHY_TYPE_AC, WL_CHAN_FREQ_RANGE_5G_4BAND, 3, "pa5gbw4080a1"}, + {PHY_TYPE_NULL, 0, 0, ""} +}; + typedef struct { uint16 phy_type; uint16 bandrange; @@ -903,10 +986,14 @@ static const cis_tuple_t cis_hnbuvars[] = { "0rxgains5gelnagaina2 0rxgains2gtrelnabypa2 0rxgains2gtrisoa2 0rxgains2gelnagaina2 " "0rxgains5ghtrelnabypa2 0rxgains5ghtrisoa2 0rxgains5ghelnagaina2 0rxgains5gmtrelnabypa2 " "0rxgains5gmtrisoa2 0rxgains5gmelnagaina2"}, /* special case */ - {HNBU_TXDUTY, 0xfffff800, 9, "2tx_duty_cycle_ofdm_40_5g " + {HNBU_TXDUTY, 0xfffff800, 9, "2tx_duty_cycle_ofdm_40_5g " "2tx_duty_cycle_thresh_40_5g 2tx_duty_cycle_ofdm_80_5g 2tx_duty_cycle_thresh_80_5g"}, {HNBU_PDOFF_2G, 0xfffff800, 3, "0pdoffset2g40ma0 0pdoffset2g40ma1 " "0pdoffset2g40ma2 0pdoffset2g40mvalid"}, + {HNBU_ACPA_CCK, 0xfffff800, 7, "2*3pa2gccka0"}, + {HNBU_ACPA_40, 0xfffff800, 25, "2*12pa5gbw40a0"}, + {HNBU_ACPA_80, 0xfffff800, 25, "2*12pa5gbw80a0"}, + {HNBU_ACPA_4080, 0xfffff800, 49, "2*12pa5gbw4080a0 2*12pa5gbw4080a1"}, {0xFF, 0xffffffff, 0, ""} }; diff --git a/drivers/net/wireless/bcmdhd/include/bcmutils.h b/drivers/net/wireless/bcmdhd/include/bcmutils.h index ddc2caab3bd..298ec19378a 100644 --- a/drivers/net/wireless/bcmdhd/include/bcmutils.h +++ b/drivers/net/wireless/bcmdhd/include/bcmutils.h @@ -1,7 +1,7 @@ /* * Misc useful os-independent macros and functions. * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -21,7 +21,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: bcmutils.h 412798 2013-07-16 15:59:30Z $ + * $Id: bcmutils.h 427979 2013-10-07 08:35:57Z $ */ #ifndef _bcmutils_h_ @@ -121,8 +121,8 @@ typedef struct { uint32 max_avail; uint32 max_used; uint32 queue_capacity; - uint32 rtsfail; - uint32 acked; + uint32 rtsfail; + uint32 acked; } pktq_counters_t; #endif @@ -139,9 +139,9 @@ struct pktq { struct pktq_prec q[PKTQ_MAX_PREC]; #ifdef PKTQ_LOG - pktq_counters_t _prec_cnt[PKTQ_MAX_PREC]; - pktq_counters_t _prec_bytes[PKTQ_MAX_PREC]; - uint32 _logtime; + pktq_counters_t _prec_cnt[PKTQ_MAX_PREC]; + pktq_counters_t _prec_bytes[PKTQ_MAX_PREC]; + uint32 _logtime; #endif }; @@ -386,7 +386,7 @@ extern int bcm_ether_atoe(const char *p, struct ether_addr *ea); struct ipv4_addr; extern char *bcm_ip_ntoa(struct ipv4_addr *ia, char *buf); - +extern int bcm_atoipv4(const char *p, struct ipv4_addr *ip); extern void bcm_mdelay(uint ms); @@ -529,7 +529,11 @@ extern int bcm_format_ssid(char* buf, const uchar ssid[], uint ssid_len); #define BCME_NODEVICE -40 #define BCME_NMODE_DISABLED -41 #define BCME_NONRESIDENT -42 -#define BCME_LAST BCME_NONRESIDENT +#define BCME_SCANREJECT -43 +#define BCME_USAGE_ERROR -44 +#define BCME_IOCTL_ERROR -45 +#define BCME_SERIAL_PORT_ERR -46 +#define BCME_LAST BCME_SERIAL_PORT_ERR #define BCMERRSTRINGTABLE { \ @@ -576,6 +580,10 @@ extern int bcm_format_ssid(char* buf, const uchar ssid[], uint ssid_len); "Device Not Present", \ "NMODE Disabled", \ "Nonresident overlay access", \ + "Scan Rejected", \ + "WLCMD usage error", \ + "WLCMD ioctl error", \ + "RWL serial port error", \ } #ifndef ABS @@ -594,19 +602,19 @@ extern int bcm_format_ssid(char* buf, const uchar ssid[], uint ssid_len); #ifndef LIMIT_TO_RANGE #define LIMIT_TO_RANGE(x, min, max) \ ((x) < (min) ? (min) : ((x) > (max) ? (max) : (x))) -#endif +#endif #ifndef LIMIT_TO_MAX #define LIMIT_TO_MAX(x, max) \ (((x) > (max) ? (max) : (x))) -#endif +#endif #ifndef LIMIT_TO_MIN #define LIMIT_TO_MIN(x, min) \ (((x) < (min) ? (min) : (x))) -#endif +#endif #define CEIL(x, y) (((x) + ((y) - 1)) / (y)) #define ROUNDUP(x, y) ((((x) + ((y) - 1)) / (y)) * (y)) @@ -632,19 +640,30 @@ extern int bcm_format_ssid(char* buf, const uchar ssid[], uint ssid_len); #define ARRAYSIZE(a) (sizeof(a) / sizeof(a[0])) #endif +#ifndef ARRAYLAST +#define ARRAYLAST(a) (&a[ARRAYSIZE(a)-1]) +#endif + extern void *_bcmutils_dummy_fn; #define REFERENCE_FUNCTION(f) (_bcmutils_dummy_fn = (void *)(f)) #ifndef setbit -#ifndef NBBY +#ifndef NBBY #define NBBY 8 #endif +#ifdef BCMUTILS_BIT_MACROS_USE_FUNCS +extern void setbit(void *array, uint bit); +extern void clrbit(void *array, uint bit); +extern bool isset(const void *array, uint bit); +extern bool isclr(const void *array, uint bit); +#else #define setbit(a, i) (((uint8 *)a)[(i) / NBBY] |= 1 << ((i) % NBBY)) #define clrbit(a, i) (((uint8 *)a)[(i) / NBBY] &= ~(1 << ((i) % NBBY))) #define isset(a, i) (((const uint8 *)a)[(i) / NBBY] & (1 << ((i) % NBBY))) #define isclr(a, i) ((((const uint8 *)a)[(i) / NBBY] & (1 << ((i) % NBBY))) == 0) +#endif #endif #define isbitset(a, i) (((a) & (1 << (i))) != 0) @@ -705,7 +724,7 @@ extern void *_bcmutils_dummy_fn; #else #define MACDBG "%02x:%02x:%02x" #define MAC2STRDBG(ea) (ea)[0], (ea)[4], (ea)[5] -#endif +#endif typedef struct bcm_bit_desc { @@ -826,6 +845,13 @@ extern uint8 bcm_mw_to_qdbm(uint16 mw); extern uint bcm_mkiovar(char *name, char *data, uint datalen, char *buf, uint len); unsigned int process_nvram_vars(char *varbuf, unsigned int len); +extern bcm_tlv_t *find_vendor_ie(void *tlvs, int tlvs_len, + const char *voui, uint8 *type, int type_len); + + +extern void bcm_uint64_multiple_add(uint32* r_high, uint32* r_low, uint32 a, uint32 b, uint32 c); + +extern void bcm_uint64_divide(uint32* r, uint32 a_high, uint32 a_low, uint32 b); #ifdef __cplusplus } diff --git a/drivers/net/wireless/bcmdhd/include/dbus.h b/drivers/net/wireless/bcmdhd/include/dbus.h index 9784e1fe874..4458e74faf7 100644 --- a/drivers/net/wireless/bcmdhd/include/dbus.h +++ b/drivers/net/wireless/bcmdhd/include/dbus.h @@ -2,7 +2,7 @@ * Dongle BUS interface Abstraction layer * target serial buses like USB, SDIO, SPI, etc. * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -22,7 +22,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: dbus.h 349214 2012-08-07 10:04:38Z $ + * $Id: dbus.h 397286 2013-04-18 01:42:19Z $ */ #ifndef __DBUS_H__ diff --git a/drivers/net/wireless/bcmdhd/include/dhdioctl.h b/drivers/net/wireless/bcmdhd/include/dhdioctl.h index 53bab2c84ba..08758e1ffe8 100644 --- a/drivers/net/wireless/bcmdhd/include/dhdioctl.h +++ b/drivers/net/wireless/bcmdhd/include/dhdioctl.h @@ -5,7 +5,7 @@ * * Definitions subject to change without notice. * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -25,7 +25,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: dhdioctl.h 358413 2012-09-24 04:50:47Z $ + * $Id: dhdioctl.h 419132 2013-08-19 21:33:05Z $ */ #ifndef _dhdioctl_h_ @@ -85,16 +85,13 @@ enum { #define DHD_GLOM_VAL 0x0400 #define DHD_EVENT_VAL 0x0800 #define DHD_BTA_VAL 0x1000 -#if 0 && (NDISVER >= 0x0630) && 1 -#define DHD_SCAN_VAL 0x2000 -#else #define DHD_ISCAN_VAL 0x2000 -#endif #define DHD_ARPOE_VAL 0x4000 #define DHD_REORDER_VAL 0x8000 #define DHD_WL_VAL 0x10000 #define DHD_NOCHECKDIED_VAL 0x20000 /* UTF WAR */ #define DHD_WL_VAL2 0x40000 +#define DHD_PNO_VAL 0x80000 #ifdef SDTEST /* For pktgen iovar */ diff --git a/drivers/net/wireless/bcmdhd/include/epivers.h b/drivers/net/wireless/bcmdhd/include/epivers.h index aaa0b07b0a4..dd810a8380e 100644 --- a/drivers/net/wireless/bcmdhd/include/epivers.h +++ b/drivers/net/wireless/bcmdhd/include/epivers.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -28,28 +28,28 @@ #define EPI_MAJOR_VERSION 1 -#define EPI_MINOR_VERSION 61 +#define EPI_MINOR_VERSION 88 -#define EPI_RC_NUMBER 74 +#define EPI_RC_NUMBER 63 #define EPI_INCREMENTAL_NUMBER 0 #define EPI_BUILD_NUMBER 0 -#define EPI_VERSION 1, 61, 74, 0 +#define EPI_VERSION 1, 88, 63, 0 -#define EPI_VERSION_NUM 0x013d4a00 +#define EPI_VERSION_NUM 0x01583f00 -#define EPI_VERSION_DEV 1.61.74 +#define EPI_VERSION_DEV 1.88.63 /* Driver Version String, ASCII, 32 chars max */ #ifdef BCMINTERNAL -#define EPI_VERSION_STR "1.61.74 (r BCMINT)" +#define EPI_VERSION_STR "1.88.63 (r BCMINT)" #else #ifdef WLTEST -#define EPI_VERSION_STR "1.61.74 (r WLTEST)" +#define EPI_VERSION_STR "1.88.63 (r WLTEST)" #else -#define EPI_VERSION_STR "1.61.74 (r)" +#define EPI_VERSION_STR "1.88.63 (r)" #endif #endif /* BCMINTERNAL */ diff --git a/drivers/net/wireless/bcmdhd/include/hndpmu.h b/drivers/net/wireless/bcmdhd/include/hndpmu.h index 810795ad579..9ed9de264da 100644 --- a/drivers/net/wireless/bcmdhd/include/hndpmu.h +++ b/drivers/net/wireless/bcmdhd/include/hndpmu.h @@ -1,7 +1,7 @@ /* * HND SiliconBackplane PMU support. * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -21,7 +21,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: hndpmu.h 344142 2012-07-11 10:50:39Z $ + * $Id: hndpmu.h 385540 2013-02-15 23:14:50Z $ */ #ifndef _hndpmu_h_ diff --git a/drivers/net/wireless/bcmdhd/include/hndrte_armtrap.h b/drivers/net/wireless/bcmdhd/include/hndrte_armtrap.h index 90d97992938..875a6935f22 100644 --- a/drivers/net/wireless/bcmdhd/include/hndrte_armtrap.h +++ b/drivers/net/wireless/bcmdhd/include/hndrte_armtrap.h @@ -1,7 +1,7 @@ /* * HNDRTE arm trap handling. * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd/include/hndrte_cons.h b/drivers/net/wireless/bcmdhd/include/hndrte_cons.h index 57abbbd5b67..4e4272087cc 100644 --- a/drivers/net/wireless/bcmdhd/include/hndrte_cons.h +++ b/drivers/net/wireless/bcmdhd/include/hndrte_cons.h @@ -1,7 +1,7 @@ /* * Console support for hndrte. * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -21,7 +21,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: hndrte_cons.h 300516 2011-12-04 17:39:44Z $ + * $Id: hndrte_cons.h 383834 2013-02-07 23:21:51Z $ */ #ifndef _HNDRTE_CONS_H #define _HNDRTE_CONS_H @@ -64,4 +64,6 @@ typedef struct { char cbuf[CBUF_LEN]; } hndrte_cons_t; +hndrte_cons_t *hndrte_get_active_cons_state(void); + #endif /* _HNDRTE_CONS_H */ diff --git a/drivers/net/wireless/bcmdhd/include/hndsoc.h b/drivers/net/wireless/bcmdhd/include/hndsoc.h index f5c161b9463..e259cc6f1c0 100644 --- a/drivers/net/wireless/bcmdhd/include/hndsoc.h +++ b/drivers/net/wireless/bcmdhd/include/hndsoc.h @@ -1,7 +1,7 @@ /* * Broadcom HND chip & on-chip-interconnect-related definitions. * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd/include/linux_osl.h b/drivers/net/wireless/bcmdhd/include/linux_osl.h index d42e0c95e1b..9918f621c98 100644 --- a/drivers/net/wireless/bcmdhd/include/linux_osl.h +++ b/drivers/net/wireless/bcmdhd/include/linux_osl.h @@ -1,7 +1,7 @@ /* * Linux OS Independent Layer * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -21,7 +21,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: linux_osl.h 411129 2013-07-05 01:24:07Z $ + * $Id: linux_osl.h 411126 2013-07-05 01:22:09Z $ */ #ifndef _linux_osl_h_ @@ -172,7 +172,7 @@ extern int osl_error(int bcmerror); #define OSL_SYSUPTIME() ((uint32)jiffies_to_msecs(jiffies)) #else #define OSL_SYSUPTIME() ((uint32)jiffies * (1000 / HZ)) -#endif +#endif #define printf(fmt, args...) printk(fmt , ## args) #include #include @@ -265,6 +265,9 @@ extern int osl_error(int bcmerror); #ifdef CONFIG_DHD_USE_STATIC_BUF #define PKTGET_STATIC(osh, len, send) osl_pktget_static((osh), (len)) #define PKTFREE_STATIC(osh, skb, send) osl_pktfree_static((osh), (skb), (send)) +#else +#define PKTGET_STATIC PKTGET +#define PKTFREE_STATIC PKTFREE #endif #define PKTDATA(osh, skb) (((struct sk_buff*)(skb))->data) #define PKTLEN(osh, skb) (((struct sk_buff*)(skb))->len) @@ -281,6 +284,7 @@ extern int osl_error(int bcmerror); #define PKTPOOL(osh, skb) FALSE #define PKTSHRINK(osh, m) (m) + #ifdef CTFPOOL #define CTFPOOL_REFILL_THRESH 3 typedef struct ctfpool { @@ -294,38 +298,24 @@ typedef struct ctfpool { uint fast_frees; uint slow_allocs; } ctfpool_t; -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 22) #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 36) #define FASTBUF (1 << 0) -#define CTFBUF (1 << 1) #define PKTSETFAST(osh, skb) ((((struct sk_buff*)(skb))->pktc_flags) |= FASTBUF) #define PKTCLRFAST(osh, skb) ((((struct sk_buff*)(skb))->pktc_flags) &= (~FASTBUF)) -#define PKTSETCTF(osh, skb) ((((struct sk_buff*)(skb))->pktc_flags) |= CTFBUF) -#define PKTCLRCTF(osh, skb) ((((struct sk_buff*)(skb))->pktc_flags) &= (~CTFBUF)) #define PKTISFAST(osh, skb) ((((struct sk_buff*)(skb))->pktc_flags) & FASTBUF) -#define PKTISCTF(osh, skb) ((((struct sk_buff*)(skb))->pktc_flags) & CTFBUF) #define PKTFAST(osh, skb) (((struct sk_buff*)(skb))->pktc_flags) -#else +#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 22) #define FASTBUF (1 << 16) -#define CTFBUF (1 << 17) #define PKTSETFAST(osh, skb) ((((struct sk_buff*)(skb))->mac_len) |= FASTBUF) #define PKTCLRFAST(osh, skb) ((((struct sk_buff*)(skb))->mac_len) &= (~FASTBUF)) -#define PKTSETCTF(osh, skb) ((((struct sk_buff*)(skb))->mac_len) |= CTFBUF) -#define PKTCLRCTF(osh, skb) ((((struct sk_buff*)(skb))->mac_len) &= (~CTFBUF)) #define PKTISFAST(osh, skb) ((((struct sk_buff*)(skb))->mac_len) & FASTBUF) -#define PKTISCTF(osh, skb) ((((struct sk_buff*)(skb))->mac_len) & CTFBUF) #define PKTFAST(osh, skb) (((struct sk_buff*)(skb))->mac_len) -#endif #else #define FASTBUF (1 << 0) -#define CTFBUF (1 << 1) #define PKTSETFAST(osh, skb) ((((struct sk_buff*)(skb))->__unused) |= FASTBUF) #define PKTCLRFAST(osh, skb) ((((struct sk_buff*)(skb))->__unused) &= (~FASTBUF)) -#define PKTSETCTF(osh, skb) ((((struct sk_buff*)(skb))->__unused) |= CTFBUF) -#define PKTCLRCTF(osh, skb) ((((struct sk_buff*)(skb))->__unused) &= (~CTFBUF)) #define PKTISFAST(osh, skb) ((((struct sk_buff*)(skb))->__unused) & FASTBUF) -#define PKTISCTF(osh, skb) ((((struct sk_buff*)(skb))->__unused) & CTFBUF) #define PKTFAST(osh, skb) (((struct sk_buff*)(skb))->__unused) #endif @@ -342,11 +332,17 @@ extern void osl_ctfpool_replenish(osl_t *osh, uint thresh); extern int32 osl_ctfpool_init(osl_t *osh, uint numobj, uint size); extern void osl_ctfpool_cleanup(osl_t *osh); extern void osl_ctfpool_stats(osl_t *osh, void *b); +#else +#define PKTSETFAST(osh, skb) +#define PKTCLRFAST(osh, skb) +#define PKTISFAST(osh, skb) (FALSE) #endif +#define PKTSETCTF(osh, skb) +#define PKTCLRCTF(osh, skb) +#define PKTISCTF(osh, skb) (FALSE) #ifdef HNDCTF -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 22) #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 36) #define SKIPCT (1 << 2) @@ -357,7 +353,7 @@ extern void osl_ctfpool_stats(osl_t *osh, void *b); #define PKTSETCHAINED(osh, skb) (((struct sk_buff*)(skb))->pktc_flags |= CHAINED) #define PKTCLRCHAINED(osh, skb) (((struct sk_buff*)(skb))->pktc_flags &= (~CHAINED)) #define PKTISCHAINED(skb) (((struct sk_buff*)(skb))->pktc_flags & CHAINED) -#else +#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 22) #define SKIPCT (1 << 18) #define CHAINED (1 << 19) #define PKTSETSKIPCT(osh, skb) (((struct sk_buff*)(skb))->mac_len |= SKIPCT) @@ -366,7 +362,6 @@ extern void osl_ctfpool_stats(osl_t *osh, void *b); #define PKTSETCHAINED(osh, skb) (((struct sk_buff*)(skb))->mac_len |= CHAINED) #define PKTCLRCHAINED(osh, skb) (((struct sk_buff*)(skb))->mac_len &= (~CHAINED)) #define PKTISCHAINED(skb) (((struct sk_buff*)(skb))->mac_len & CHAINED) -#endif #else #define SKIPCT (1 << 2) #define CHAINED (1 << 3) @@ -391,7 +386,7 @@ typedef struct ctf_mark { extern void osl_pktfree(osl_t *osh, void *skb, bool send); extern void *osl_pktget_static(osl_t *osh, uint len); extern void osl_pktfree_static(osl_t *osh, void *skb, bool send); -extern int osh_pktpadtailroom(osl_t *osh, struct sk_buff* skb, int pad); +extern int osh_pktpadtailroom(osl_t *osh, void* skb, int pad); extern void *osl_pkt_frmnative(osl_t *osh, void *skb); extern void *osl_pktget(osl_t *osh, uint len); @@ -414,14 +409,14 @@ extern struct sk_buff *osl_pkt_tonative(osl_t *osh, void *pkt); #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0)) #define PKTMARK(p) (((struct sk_buff *)(p))->mark) #define PKTSETMARK(p, m) ((struct sk_buff *)(p))->mark = (m) -#else +#else #define PKTMARK(p) (((struct sk_buff *)(p))->nfmark) #define PKTSETMARK(p, m) ((struct sk_buff *)(p))->nfmark = (m) -#endif -#else +#endif +#else #define PKTMARK(p) 0 #define PKTSETMARK(p, m) -#endif +#endif #define PKTALLOCED(osh) osl_pktalloced(osh) extern uint osl_pktalloced(osl_t *osh); @@ -436,11 +431,7 @@ struct chain_node { unsigned int flags:3, pkts:9, bytes:20; }; -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 14) -#define CHAIN_NODE(skb) ((struct chain_node*)&(((struct sk_buff*)skb)->tstamp)) -#else -#define CHAIN_NODE(skb) ((struct chain_node*)&(((struct sk_buff*)skb)->stamp)) -#endif +#define CHAIN_NODE(skb) ((struct chain_node*)(((struct sk_buff*)skb)->pktc_cb)) #define PKTCSETATTR(s, f, p, b) ({CHAIN_NODE(s)->flags = (f); CHAIN_NODE(s)->pkts = (p); \ CHAIN_NODE(s)->bytes = (b);}) @@ -450,6 +441,9 @@ struct chain_node { CHAIN_NODE(s)->bytes) #define PKTCCNT(skb) (CHAIN_NODE(skb)->pkts) #define PKTCLEN(skb) (CHAIN_NODE(skb)->bytes) +#define PKTCGETFLAGS(skb) (CHAIN_NODE(skb)->flags) +#define PKTCSETFLAGS(skb, f) (CHAIN_NODE(skb)->flags = (f)) +#define PKTCCLRFLAGS(skb) (CHAIN_NODE(skb)->flags = 0) #define PKTCFLAGS(skb) (CHAIN_NODE(skb)->flags) #define PKTCSETCNT(skb, c) (CHAIN_NODE(skb)->pkts = (c)) #define PKTCINCRCNT(skb) (CHAIN_NODE(skb)->pkts++) @@ -470,7 +464,7 @@ do { \ ASSERT((skb) != NULL); \ FOREACH_CHAINED_PKT((skb), nskb) { \ PKTCLRCHAINED((osh), (skb)); \ - PKTCCLRATTR((skb)); \ + PKTCCLRFLAGS((skb)); \ PKTFREE((osh), (skb), (send)); \ } \ } while (0) diff --git a/drivers/net/wireless/bcmdhd/include/linuxver.h b/drivers/net/wireless/bcmdhd/include/linuxver.h index 97829f05beb..f0b29f6921a 100644 --- a/drivers/net/wireless/bcmdhd/include/linuxver.h +++ b/drivers/net/wireless/bcmdhd/include/linuxver.h @@ -2,7 +2,7 @@ * Linux-specific abstractions to gain some independence from linux kernel versions. * Pave over some 2.2 versus 2.4 versus 2.6 kernel differences. * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -22,12 +22,13 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: linuxver.h 416251 2013-08-02 10:57:29Z $ + * $Id: linuxver.h 417757 2013-08-12 12:24:45Z $ */ #ifndef _linuxver_h_ #define _linuxver_h_ +#include #include #if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 0)) #include @@ -98,7 +99,10 @@ #endif #endif -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0)) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)) +#define DAEMONIZE(a) +#elif ((LINUX_VERSION_CODE < KERNEL_VERSION(3, 8, 0)) && \ + (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0))) #define DAEMONIZE(a) daemonize(a); \ allow_signal(SIGKILL); \ allow_signal(SIGTERM); @@ -151,7 +155,11 @@ typedef irqreturn_t(*FN_ISR) (int irq, void *dev_id, struct pt_regs *ptregs); #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 32) #include -#endif +#endif + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0)) +#include +#endif #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 29) #include @@ -485,11 +493,11 @@ pci_restore_state(struct pci_dev *dev, u32 *buffer) #endif typedef struct { - void *parent; - char *proc_name; + void *parent; + char *proc_name; struct task_struct *p_task; - long thr_pid; - int prio; + long thr_pid; + int prio; struct semaphore sema; int terminated; struct completion completed; @@ -522,7 +530,7 @@ static inline bool binary_sema_down(tsk_ctl_t *tsk) return TRUE; } -static inline bool binary_sema_up(tsk_ctl_t *tsk) +static inline bool binary_sema_up(tsk_ctl_t *tsk) { bool sem_up = FALSE; unsigned long flags = 0; @@ -659,4 +667,16 @@ do { \ #define netdev_priv(dev) dev->priv #endif +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)) +#define RANDOM32 prandom_u32 +#else +#define RANDOM32 random32 +#endif + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)) +#define SRANDOM32(entropy) prandom_seed(entropy) +#else +#define SRANDOM32(entropy) srandom32(entropy) +#endif + #endif diff --git a/drivers/net/wireless/bcmdhd/include/miniopt.h b/drivers/net/wireless/bcmdhd/include/miniopt.h index c1eca68a602..ba48da04438 100644 --- a/drivers/net/wireless/bcmdhd/include/miniopt.h +++ b/drivers/net/wireless/bcmdhd/include/miniopt.h @@ -1,7 +1,7 @@ /* * Command line options parser. * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd/include/msgtrace.h b/drivers/net/wireless/bcmdhd/include/msgtrace.h index 7c5fd8106f3..aa5261a1e69 100644 --- a/drivers/net/wireless/bcmdhd/include/msgtrace.h +++ b/drivers/net/wireless/bcmdhd/include/msgtrace.h @@ -1,7 +1,7 @@ /* * Trace messages sent over HBUS * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -21,7 +21,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: msgtrace.h 281527 2011-09-02 17:12:53Z $ + * $Id: msgtrace.h 369735 2012-11-19 22:50:22Z $ */ #ifndef _MSGTRACE_H @@ -40,11 +40,14 @@ /* Message trace header */ typedef BWL_PRE_PACKED_STRUCT struct msgtrace_hdr { uint8 version; - uint8 spare; + uint8 trace_type; +#define MSGTRACE_HDR_TYPE_MSG 0 +#define MSGTRACE_HDR_TYPE_LOG 1 uint16 len; /* Len of the trace */ uint32 seqnum; /* Sequence number of message. Useful if the messsage has been lost * because of DMA error or a bus reset (ex: SDIO Func2) */ + /* Msgtrace type only */ uint32 discarded_bytes; /* Number of discarded bytes because of trace overflow */ uint32 discarded_printf; /* Number of discarded printf because of trace overflow */ } BWL_POST_PACKED_STRUCT msgtrace_hdr_t; @@ -63,7 +66,7 @@ typedef void (*msgtrace_func_send_t)(void *hdl1, void *hdl2, uint8 *hdr, uint16 hdrlen, uint8 *buf, uint16 buflen); extern void msgtrace_start(void); extern void msgtrace_stop(void); -extern void msgtrace_sent(void); +extern int msgtrace_sent(void); extern void msgtrace_put(char *buf, int count); extern void msgtrace_init(void *hdl1, void *hdl2, msgtrace_func_send_t func_send); extern bool msgtrace_event_enabled(void); diff --git a/drivers/net/wireless/bcmdhd/include/osl.h b/drivers/net/wireless/bcmdhd/include/osl.h index e59cc00a0c3..19f8274ada4 100644 --- a/drivers/net/wireless/bcmdhd/include/osl.h +++ b/drivers/net/wireless/bcmdhd/include/osl.h @@ -1,7 +1,7 @@ /* * OS Abstraction Layer * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -21,7 +21,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: osl.h 346935 2012-07-25 00:24:55Z $ + * $Id: osl.h 370064 2012-11-20 21:00:25Z $ */ #ifndef _osl_h_ @@ -72,8 +72,11 @@ typedef void (*osl_wreg_fn_t)(void *ctx, volatile void *reg, unsigned int val, #define PKTCGETATTR(s) (0) #define PKTCSETATTR(skb, f, p, b) #define PKTCCLRATTR(skb) -#define PKTCCNT(skb) (0) -#define PKTCLEN(skb) (0) +#define PKTCCNT(skb) (1) +#define PKTCLEN(skb) PKTLEN(NULL, skb) +#define PKTCGETFLAGS(skb) (0) +#define PKTCSETFLAGS(skb, f) +#define PKTCCLRFLAGS(skb) #define PKTCFLAGS(skb) (0) #define PKTCSETCNT(skb, c) #define PKTCINCRCNT(skb) @@ -87,7 +90,7 @@ typedef void (*osl_wreg_fn_t)(void *ctx, volatile void *reg, unsigned int val, #define FOREACH_CHAINED_PKT(skb, nskb) \ for ((nskb) = NULL; (skb) != NULL; (skb) = (nskb)) #define PKTCFREE PKTFREE -#endif +#endif #ifndef HNDCTF #define PKTSETCHAINED(osh, skb) diff --git a/drivers/net/wireless/bcmdhd/include/packed_section_end.h b/drivers/net/wireless/bcmdhd/include/packed_section_end.h index 24ff4672734..1b668376907 100644 --- a/drivers/net/wireless/bcmdhd/include/packed_section_end.h +++ b/drivers/net/wireless/bcmdhd/include/packed_section_end.h @@ -15,7 +15,7 @@ * #include * * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd/include/packed_section_start.h b/drivers/net/wireless/bcmdhd/include/packed_section_start.h index 7fce0ddfd56..2b25925c22a 100644 --- a/drivers/net/wireless/bcmdhd/include/packed_section_start.h +++ b/drivers/net/wireless/bcmdhd/include/packed_section_start.h @@ -15,7 +15,7 @@ * #include * * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd/include/pcicfg.h b/drivers/net/wireless/bcmdhd/include/pcicfg.h index 0a984e8a59d..63f41582200 100644 --- a/drivers/net/wireless/bcmdhd/include/pcicfg.h +++ b/drivers/net/wireless/bcmdhd/include/pcicfg.h @@ -1,7 +1,7 @@ /* * pcicfg.h: PCI configuration constants and structures. * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd/include/proto/802.11.h b/drivers/net/wireless/bcmdhd/include/proto/802.11.h index ec8afc1b744..c998214d995 100644 --- a/drivers/net/wireless/bcmdhd/include/proto/802.11.h +++ b/drivers/net/wireless/bcmdhd/include/proto/802.11.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -21,7 +21,7 @@ * * Fundamental types and constants relating to 802.11 * - * $Id: 802.11.h 368403 2012-11-13 17:20:09Z $ + * $Id: 802.11.h 386067 2013-02-19 15:24:20Z $ */ #ifndef _802_11_H_ @@ -294,6 +294,12 @@ BWL_PRE_PACKED_STRUCT struct dot11_action_sa_query { uint16 id; } BWL_POST_PACKED_STRUCT; +BWL_PRE_PACKED_STRUCT struct dot11_action_vht_oper_mode { + uint8 category; + uint8 action; + uint8 mode; +} BWL_POST_PACKED_STRUCT; + #define SM_PWRSAVE_ENABLE 1 #define SM_PWRSAVE_MODE 2 @@ -412,28 +418,28 @@ BWL_PRE_PACKED_STRUCT struct dot11y_action_ext_csa { BWL_PRE_PACKED_STRUCT struct dot11_wide_bw_channel_switch { - uint8 id; - uint8 len; - uint8 channel_width; - uint8 center_frequency_segment_0; - uint8 center_frequency_segment_1; + uint8 id; + uint8 len; + uint8 channel_width; + uint8 center_frequency_segment_0; + uint8 center_frequency_segment_1; } BWL_POST_PACKED_STRUCT; typedef struct dot11_wide_bw_channel_switch dot11_wide_bw_chan_switch_ie_t; -#define DOT11_WIDE_BW_SWITCH_IE_LEN 3 +#define DOT11_WIDE_BW_SWITCH_IE_LEN 3 BWL_PRE_PACKED_STRUCT struct dot11_channel_switch_wrapper { - uint8 id; - uint8 len; + uint8 id; + uint8 len; dot11_wide_bw_chan_switch_ie_t wb_chan_switch_ie; } BWL_POST_PACKED_STRUCT; typedef struct dot11_channel_switch_wrapper dot11_chan_switch_wrapper_ie_t; BWL_PRE_PACKED_STRUCT struct dot11_vht_transmit_power_envelope { - uint8 id; - uint8 len; + uint8 id; + uint8 len; uint8 transmit_power_info; uint8 local_max_transmit_power_20; } BWL_POST_PACKED_STRUCT; @@ -468,25 +474,40 @@ BWL_PRE_PACKED_STRUCT struct dot11_extcap_ie { } BWL_POST_PACKED_STRUCT; typedef struct dot11_extcap_ie dot11_extcap_ie_t; -#define DOT11_EXTCAP_LEN_MAX 7 +#define DOT11_EXTCAP_LEN_MAX 8 + #define DOT11_EXTCAP_LEN_COEX 1 #define DOT11_EXTCAP_LEN_BT 3 #define DOT11_EXTCAP_LEN_IW 4 #define DOT11_EXTCAP_LEN_SI 6 #define DOT11_EXTCAP_LEN_TDLS 5 +#define DOT11_11AC_EXTCAP_LEN_TDLS 8 + +#define DOT11_EXTCAP_LEN_FMS 2 +#define DOT11_EXTCAP_LEN_PROXY_ARP 2 +#define DOT11_EXTCAP_LEN_TFS 3 +#define DOT11_EXTCAP_LEN_WNM_SLEEP 3 +#define DOT11_EXTCAP_LEN_TIMBC 3 +#define DOT11_EXTCAP_LEN_BSSTRANS 3 +#define DOT11_EXTCAP_LEN_DMS 4 +#define DOT11_EXTCAP_LEN_WNM_NOTIFICATION 6 +#define DOT11_EXTCAP_LEN_TDLS_WBW 8 +#define DOT11_EXTCAP_LEN_OPMODE_NOTIFICATION 8 + BWL_PRE_PACKED_STRUCT struct dot11_extcap { - uint8 extcap[DOT11_EXTCAP_LEN_TDLS]; + uint8 extcap[DOT11_EXTCAP_LEN_MAX]; } BWL_POST_PACKED_STRUCT; typedef struct dot11_extcap dot11_extcap_t; -#define TDLS_CAP_TDLS 37 -#define TDLS_CAP_PU_BUFFER_STA 28 -#define TDLS_CAP_PEER_PSM 20 -#define TDLS_CAP_CH_SW 30 -#define TDLS_CAP_PROH 38 -#define TDLS_CAP_CH_SW_PROH 39 +#define DOT11_TDLS_CAP_TDLS 37 +#define DOT11_TDLS_CAP_PU_BUFFER_STA 28 +#define DOT11_TDLS_CAP_PEER_PSM 20 +#define DOT11_TDLS_CAP_CH_SW 30 +#define DOT11_TDLS_CAP_PROH 38 +#define DOT11_TDLS_CAP_CH_SW_PROH 39 +#define DOT11_TDLS_CAP_TDLS_WIDER_BW 61 #define TDLS_CAP_MAX_BIT 39 @@ -499,7 +520,7 @@ typedef struct dot11_extcap dot11_extcap_t; #define DOT11_MEASURE_TYPE_NOISE 4 #define DOT11_MEASURE_TYPE_BEACON 5 #define DOT11_MEASURE_TYPE_FRAME 6 -#define DOT11_MEASURE_TYPE_STAT 7 +#define DOT11_MEASURE_TYPE_STAT 7 #define DOT11_MEASURE_TYPE_LCI 8 #define DOT11_MEASURE_TYPE_TXSTREAM 9 #define DOT11_MEASURE_TYPE_PAUSE 255 @@ -594,8 +615,8 @@ typedef struct dot11_ibss_dfs dot11_ibss_dfs_t; #define WME_OUI "\x00\x50\xf2" -#define WME_OUI_TYPE 2 #define WME_OUI_LEN 3 +#define WME_OUI_TYPE 2 #define WME_TYPE 2 #define WME_SUBTYPE_IE 0 #define WME_SUBTYPE_PARAM_IE 1 @@ -877,6 +898,7 @@ typedef struct ti_ie ti_ie_t; #define FC_SUBTYPE_ANY_NULL(s) (((s) & 4) != 0) #define FC_SUBTYPE_ANY_CF_POLL(s) (((s) & 2) != 0) #define FC_SUBTYPE_ANY_CF_ACK(s) (((s) & 1) != 0) +#define FC_SUBTYPE_ANY_PSPOLL(s) (((s) & 10) != 0) #define FC_KIND_MASK (FC_TYPE_MASK | FC_SUBTYPE_MASK) @@ -1020,10 +1042,11 @@ typedef struct ti_ie ti_ie_t; #define DOT11_SC_ASSOC_BAD_SUP_CHANNELS 24 #define DOT11_SC_ASSOC_SHORTSLOT_REQUIRED 25 #define DOT11_SC_ASSOC_ERPBCC_REQUIRED 26 -#define DOT11_SC_ASSOC_DSSOFDM_REQUIRED 27 +#define DOT11_SC_ASSOC_DSSSOFDM_REQUIRED 27 #define DOT11_SC_ASSOC_R0KH_UNREACHABLE 28 #define DOT11_SC_ASSOC_TRY_LATER 30 #define DOT11_SC_ASSOC_MFP_VIOLATION 31 +#define DOT11_SC_ASSOC_HT_REQUIRED 32 #define DOT11_SC_DECLINED 37 #define DOT11_SC_INVALID_PARAMS 38 @@ -1035,9 +1058,19 @@ typedef struct ti_ie ti_ie_t; #define DOT11_SC_INVALID_MDID 54 #define DOT11_SC_INVALID_FTIE 55 +#define DOT11_SC_ADV_PROTO_NOT_SUPPORTED 59 +#define DOT11_SC_NO_OUTSTAND_REQ 60 +#define DOT11_SC_RSP_NOT_RX_FROM_SERVER 61 +#define DOT11_SC_TIMEOUT 62 +#define DOT11_SC_QUERY_RSP_TOO_LARGE 63 +#define DOT11_SC_SERVER_UNREACHABLE 65 + #define DOT11_SC_UNEXP_MSG 70 #define DOT11_SC_INVALID_SNONCE 71 #define DOT11_SC_INVALID_RSNIE 72 +#define DOT11_SC_ASSOC_VHT_REQUIRED 104 + +#define DOT11_SC_TRANSMIT_FAILURE 79 #define DOT11_MNG_DS_PARAM_LEN 1 @@ -1070,6 +1103,8 @@ typedef struct ti_ie ti_ie_t; #define DOT11_MNG_REQUEST_ID 10 #define DOT11_MNG_QBSS_LOAD_ID 11 #define DOT11_MNG_EDCA_PARAM_ID 12 +#define DOT11_MNG_TSPEC_ID 13 +#define DOT11_MNG_TCLAS_ID 14 #define DOT11_MNG_CHALLENGE_ID 16 #define DOT11_MNG_PWR_CONSTRAINT_ID 32 #define DOT11_MNG_PWR_CAP_ID 33 @@ -1083,40 +1118,50 @@ typedef struct ti_ie ti_ie_t; #define DOT11_MNG_IBSS_DFS_ID 41 #define DOT11_MNG_ERP_ID 42 #define DOT11_MNG_TS_DELAY_ID 43 +#define DOT11_MNG_TCLAS_PROC_ID 44 #define DOT11_MNG_HT_CAP 45 #define DOT11_MNG_QOS_CAP_ID 46 #define DOT11_MNG_NONERP_ID 47 #define DOT11_MNG_RSN_ID 48 #define DOT11_MNG_EXT_RATES_ID 50 -#define DOT11_MNG_AP_CHREP_ID 51 -#define DOT11_MNG_NBR_REP_ID 52 -#define DOT11_MNG_RCPI_ID 53 -#define DOT11_MNG_MDIE_ID 54 -#define DOT11_MNG_FTIE_ID 55 -#define DOT11_MNG_FT_TI_ID 56 +#define DOT11_MNG_AP_CHREP_ID 51 +#define DOT11_MNG_NEIGHBOR_REP_ID 52 +#define DOT11_MNG_RCPI_ID 53 +#define DOT11_MNG_MDIE_ID 54 +#define DOT11_MNG_FTIE_ID 55 +#define DOT11_MNG_FT_TI_ID 56 +#define DOT11_MNG_RDE_ID 57 #define DOT11_MNG_REGCLASS_ID 59 #define DOT11_MNG_EXT_CSA_ID 60 #define DOT11_MNG_HT_ADD 61 #define DOT11_MNG_EXT_CHANNEL_OFFSET 62 -#define DOT11_MNG_BSS_AVR_ACCESS_DELAY_ID 63 -#define DOT11_MNG_ANTENNA_ID 64 -#define DOT11_MNG_RSNI_ID 65 -#define DOT11_MNG_MEASUREMENT_PILOT_TX_ID 66 -#define DOT11_MNG_BSS_AVAL_ADMISSION_CAP_ID 67 -#define DOT11_MNG_BSS_AC_ACCESS_DELAY_ID 68 +#define DOT11_MNG_BSS_AVR_ACCESS_DELAY_ID 63 +#define DOT11_MNG_ANTENNA_ID 64 +#define DOT11_MNG_RSNI_ID 65 +#define DOT11_MNG_MEASUREMENT_PILOT_TX_ID 66 +#define DOT11_MNG_BSS_AVAL_ADMISSION_CAP_ID 67 +#define DOT11_MNG_BSS_AC_ACCESS_DELAY_ID 68 #define DOT11_MNG_WAPI_ID 68 #define DOT11_MNG_TIME_ADVERTISE_ID 69 #define DOT11_MNG_RRM_CAP_ID 70 -#define DOT11_MNG_MULTIPLE_BSSID_ID 71 +#define DOT11_MNG_MULTIPLE_BSSID_ID 71 #define DOT11_MNG_HT_BSS_COEXINFO_ID 72 #define DOT11_MNG_HT_BSS_CHANNEL_REPORT_ID 73 #define DOT11_MNG_HT_OBSS_ID 74 -#define DOT11_MNG_MMIE_ID 76 -#define DOT11_MNG_CHANNEL_USAGE 97 +#define DOT11_MNG_MMIE_ID 76 +#define DOT11_MNG_BSS_MAX_IDLE_PERIOD_ID 90 +#define DOT11_MNG_TFS_REQUEST_ID 91 +#define DOT11_MNG_TFS_RESPONSE_ID 92 +#define DOT11_MNG_WNM_SLEEP_MODE_ID 93 +#define DOT11_MNG_TIMBC_REQ_ID 94 +#define DOT11_MNG_TIMBC_RESP_ID 95 +#define DOT11_MNG_CHANNEL_USAGE 97 #define DOT11_MNG_TIME_ZONE_ID 98 -#define DOT11_MNG_LINK_IDENTIFIER_ID 101 -#define DOT11_MNG_WAKEUP_SCHEDULE_ID 102 -#define DOT11_MNG_CHANNEL_SWITCH_TIMING_ID 104 +#define DOT11_MNG_DMS_REQUEST_ID 99 +#define DOT11_MNG_DMS_RESPONSE_ID 100 +#define DOT11_MNG_LINK_IDENTIFIER_ID 101 +#define DOT11_MNG_WAKEUP_SCHEDULE_ID 102 +#define DOT11_MNG_CHANNEL_SWITCH_TIMING_ID 104 #define DOT11_MNG_PTI_CONTROL_ID 105 #define DOT11_MNG_PU_BUFFER_STATUS_ID 106 #define DOT11_MNG_INTERWORKING_ID 107 @@ -1125,12 +1170,14 @@ typedef struct ti_ie ti_ie_t; #define DOT11_MNG_QOS_MAP_ID 110 #define DOT11_MNG_ROAM_CONSORT_ID 111 #define DOT11_MNG_EMERGCY_ALERT_ID 112 -#define DOT11_MNG_EXT_CAP_ID 127 -#define DOT11_MNG_VHT_CAP_ID 191 -#define DOT11_MNG_VHT_OPERATION_ID 192 -#define DOT11_MNG_WIDE_BW_CHANNEL_SWITCH_ID 194 -#define DOT11_MNG_VHT_TRANSMIT_POWER_ENVELOPE_ID 195 -#define DOT11_MNG_CHANNEL_SWITCH_WRAPPER_ID 196 +#define DOT11_MNG_EXT_CAP_ID 127 +#define DOT11_MNG_VHT_CAP_ID 191 +#define DOT11_MNG_VHT_OPERATION_ID 192 +#define DOT11_MNG_WIDE_BW_CHANNEL_SWITCH_ID 194 +#define DOT11_MNG_VHT_TRANSMIT_POWER_ENVELOPE_ID 195 +#define DOT11_MNG_CHANNEL_SWITCH_WRAPPER_ID 196 +#define DOT11_MNG_AID_ID 197 +#define DOT11_MNG_OPER_MODE_NOTIF_ID 199 #define DOT11_MNG_WPA_ID 221 @@ -1142,24 +1189,27 @@ typedef struct ti_ie ti_ie_t; -#define DOT11_RATE_1M 2 -#define DOT11_RATE_2M 4 -#define DOT11_RATE_5M5 11 -#define DOT11_RATE_11M 22 -#define DOT11_RATE_6M 12 -#define DOT11_RATE_9M 18 -#define DOT11_RATE_12M 24 -#define DOT11_RATE_18M 36 -#define DOT11_RATE_24M 48 -#define DOT11_RATE_36M 72 -#define DOT11_RATE_48M 96 -#define DOT11_RATE_54M 108 -#define DOT11_RATE_MAX 108 +#define DOT11_RATE_1M 2 +#define DOT11_RATE_2M 4 +#define DOT11_RATE_5M5 11 +#define DOT11_RATE_11M 22 +#define DOT11_RATE_6M 12 +#define DOT11_RATE_9M 18 +#define DOT11_RATE_12M 24 +#define DOT11_RATE_18M 36 +#define DOT11_RATE_24M 48 +#define DOT11_RATE_36M 72 +#define DOT11_RATE_48M 96 +#define DOT11_RATE_54M 108 +#define DOT11_RATE_MAX 108 + +#define DOT11_RATE_BASIC 0x80 +#define DOT11_RATE_MASK 0x7F -#define DOT11_RATE_BASIC 0x80 -#define DOT11_RATE_MASK 0x7F +#define DOT11_BSS_MEMBERSHIP_HT 0xFF +#define DOT11_BSS_MEMBERSHIP_VHT 0xFE #define DOT11_MNG_ERP_LEN 1 @@ -1180,24 +1230,95 @@ typedef struct ti_ie ti_ie_t; #define DOT11_CAP_PBCC 0x0040 #define DOT11_CAP_AGILITY 0x0080 #define DOT11_CAP_SPECTRUM 0x0100 +#define DOT11_CAP_QOS 0x0200 #define DOT11_CAP_SHORTSLOT 0x0400 -#define DOT11_CAP_RRM 0x1000 +#define DOT11_CAP_APSD 0x0800 +#define DOT11_CAP_RRM 0x1000 #define DOT11_CAP_CCK_OFDM 0x2000 +#define DOT11_CAP_DELAY_BA 0x4000 +#define DOT11_CAP_IMMEDIATE_BA 0x8000 #define DOT11_EXT_CAP_OBSS_COEX_MGMT 0 -#define DOT11_EXT_CAP_SPSMP 6 +#define DOT11_EXT_CAP_SPSMP 6 + +#define DOT11_EXT_CAP_FMS 11 + +#define DOT11_EXT_CAP_PROXY_ARP 12 + +#define DOT11_EXT_CAP_TFS 16 + +#define DOT11_EXT_CAP_WNM_SLEEP 17 + +#define DOT11_EXT_CAP_TIMBC 18 -#define DOT11_EXT_CAP_PROXY_ARP 12 +#define DOT11_EXT_CAP_BSSTRANS_MGMT 19 -#define DOT11_EXT_CAP_BSS_TRANSITION_MGMT 19 +#define DOT11_EXT_CAP_DMS 26 -#define DOT11_EXT_CAP_IW 31 +#define DOT11_EXT_CAP_IW 31 -#define DOT11_EXT_CAP_SI 41 -#define DOT11_EXT_CAP_SI_MASK 0x0E +#define DOT11_EXT_CAP_SI 41 +#define DOT11_EXT_CAP_SI_MASK 0x0E + +#define DOT11_EXT_CAP_WNM_NOTIF 46 + +#define DOT11_EXT_CAP_OPER_MODE_NOTIF 62 + + +#define DOT11_OPER_MODE_CHANNEL_WIDTH_SHIFT 0 +#define DOT11_OPER_MODE_CHANNEL_WIDTH_MASK 0x3 +#define DOT11_OPER_MODE_RXNSS_SHIFT 4 +#define DOT11_OPER_MODE_RXNSS_MASK 0x70 +#define DOT11_OPER_MODE_RXNSS_TYPE_SHIFT 7 +#define DOT11_OPER_MODE_RXNSS_TYPE_MASK 0x80 + +#define DOT11_OPER_MODE(type, nss, chanw) (\ + ((type) << DOT11_OPER_MODE_RXNSS_TYPE_SHIFT &\ + DOT11_OPER_MODE_RXNSS_TYPE_MASK) |\ + (((nss) - 1) << DOT11_OPER_MODE_RXNSS_SHIFT & DOT11_OPER_MODE_RXNSS_MASK) |\ + ((chanw) << DOT11_OPER_MODE_CHANNEL_WIDTH_SHIFT &\ + DOT11_OPER_MODE_CHANNEL_WIDTH_MASK)) + +#define DOT11_OPER_MODE_CHANNEL_WIDTH(mode) \ + (((mode) & DOT11_OPER_MODE_CHANNEL_WIDTH_MASK)\ + >> DOT11_OPER_MODE_CHANNEL_WIDTH_SHIFT) +#define DOT11_OPER_MODE_RXNSS(mode) \ + ((((mode) & DOT11_OPER_MODE_RXNSS_MASK) \ + >> DOT11_OPER_MODE_RXNSS_SHIFT) + 1) +#define DOT11_OPER_MODE_RXNSS_TYPE(mode) \ + (((mode) & DOT11_OPER_MODE_RXNSS_TYPE_MASK)\ + >> DOT11_OPER_MODE_RXNSS_TYPE_SHIFT) + +#define DOT11_OPER_MODE_20MHZ 0 +#define DOT11_OPER_MODE_40MHZ 1 +#define DOT11_OPER_MODE_80MHZ 2 +#define DOT11_OPER_MODE_160MHZ 3 +#define DOT11_OPER_MODE_8080MHZ 3 + +#define DOT11_OPER_MODE_CHANNEL_WIDTH_20MHZ(mode) (\ + ((mode) & DOT11_OPER_MODE_CHANNEL_WIDTH_MASK) == DOT11_OPER_MODE_20MHZ) +#define DOT11_OPER_MODE_CHANNEL_WIDTH_40MHZ(mode) (\ + ((mode) & DOT11_OPER_MODE_CHANNEL_WIDTH_MASK) == DOT11_OPER_MODE_40MHZ) +#define DOT11_OPER_MODE_CHANNEL_WIDTH_80MHZ(mode) (\ + ((mode) & DOT11_OPER_MODE_CHANNEL_WIDTH_MASK) == DOT11_OPER_MODE_80MHZ) +#define DOT11_OPER_MODE_CHANNEL_WIDTH_160MHZ(mode) (\ + ((mode) & DOT11_OPER_MODE_CHANNEL_WIDTH_MASK) == DOT11_OPER_MODE_160MHZ) +#define DOT11_OPER_MODE_CHANNEL_WIDTH_8080MHZ(mode) (\ + ((mode) & DOT11_OPER_MODE_CHANNEL_WIDTH_MASK) == DOT11_OPER_MODE_8080MHZ) + + +BWL_PRE_PACKED_STRUCT struct dot11_oper_mode_notif_ie { + uint8 mode; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_oper_mode_notif_ie dot11_oper_mode_notif_ie_t; + +#define DOT11_OPER_MODE_NOTIF_IE_LEN 1 + + +#define DOT11_OBSS_COEX_MNG_SUPPORT 0x01 #define DOT11_ACTION_HDR_LEN 2 @@ -1217,8 +1338,10 @@ typedef struct ti_ie ti_ie_t; #define DOT11_ACTION_CAT_HT 7 #define DOT11_ACTION_CAT_SA_QUERY 8 #define DOT11_ACTION_CAT_PDPA 9 -#define DOT11_ACTION_CAT_WNM 10 +#define DOT11_ACTION_CAT_WNM 10 +#define DOT11_ACTION_CAT_UWNM 11 #define DOT11_ACTION_NOTIFICATION 17 +#define DOT11_ACTION_CAT_VHT 21 #define DOT11_ACTION_CAT_VSP 126 #define DOT11_ACTION_CAT_VS 127 @@ -1263,43 +1386,52 @@ typedef struct ti_ie ti_ie_t; #define DOT11_FT_ACTION_FT_ACK 4 -#define DOT11_DLS_ACTION_REQ 0 -#define DOT11_DLS_ACTION_RESP 1 -#define DOT11_DLS_ACTION_TD 2 +#define DOT11_DLS_ACTION_REQ 0 +#define DOT11_DLS_ACTION_RESP 1 +#define DOT11_DLS_ACTION_TD 2 -#define DOT11_WNM_ACTION_EVENT_REQ 0 -#define DOT11_WNM_ACTION_EVENT_REP 1 -#define DOT11_WNM_ACTION_DIAG_REQ 2 -#define DOT11_WNM_ACTION_DIAG_REP 3 +#define DOT11_WNM_ACTION_EVENT_REQ 0 +#define DOT11_WNM_ACTION_EVENT_REP 1 +#define DOT11_WNM_ACTION_DIAG_REQ 2 +#define DOT11_WNM_ACTION_DIAG_REP 3 #define DOT11_WNM_ACTION_LOC_CFG_REQ 4 #define DOT11_WNM_ACTION_LOC_RFG_RESP 5 -#define DOT11_WNM_ACTION_BSS_TRANS_QURY 6 -#define DOT11_WNM_ACTION_BSS_TRANS_REQ 7 -#define DOT11_WNM_ACTION_BSS_TRANS_RESP 8 -#define DOT11_WNM_ACTION_FMS_REQ 9 -#define DOT11_WNM_ACTION_FMS_RESP 10 +#define DOT11_WNM_ACTION_BSSTRANS_QUERY 6 +#define DOT11_WNM_ACTION_BSSTRANS_REQ 7 +#define DOT11_WNM_ACTION_BSSTRANS_RESP 8 +#define DOT11_WNM_ACTION_FMS_REQ 9 +#define DOT11_WNM_ACTION_FMS_RESP 10 #define DOT11_WNM_ACTION_COL_INTRFRNCE_REQ 11 #define DOT11_WNM_ACTION_COL_INTRFRNCE_REP 12 -#define DOT11_WNM_ACTION_TFS_REQ 13 -#define DOT11_WNM_ACTION_TFS_RESP 14 -#define DOT11_WNM_ACTION_TFS_NOTIFY 15 +#define DOT11_WNM_ACTION_TFS_REQ 13 +#define DOT11_WNM_ACTION_TFS_RESP 14 +#define DOT11_WNM_ACTION_TFS_NOTIFY 15 #define DOT11_WNM_ACTION_WNM_SLEEP_REQ 16 #define DOT11_WNM_ACTION_WNM_SLEEP_RESP 17 -#define DOT11_WNM_ACTION_TIM_BCAST_REQ 18 -#define DOT11_WNM_ACTION_TIM_BCAST_RESP 19 +#define DOT11_WNM_ACTION_TIMBC_REQ 18 +#define DOT11_WNM_ACTION_TIMBC_RESP 19 #define DOT11_WNM_ACTION_QOS_TRFC_CAP_UPD 20 #define DOT11_WNM_ACTION_CHAN_USAGE_REQ 21 #define DOT11_WNM_ACTION_CHAN_USAGE_RESP 22 -#define DOT11_WNM_ACTION_DMS_REQ 23 -#define DOT11_WNM_ACTION_DMS_RESP 24 +#define DOT11_WNM_ACTION_DMS_REQ 23 +#define DOT11_WNM_ACTION_DMS_RESP 24 #define DOT11_WNM_ACTION_TMNG_MEASUR_REQ 25 #define DOT11_WNM_ACTION_NOTFCTN_REQ 26 -#define DOT11_WNM_ACTION_NOTFCTN_RES 27 +#define DOT11_WNM_ACTION_NOTFCTN_RESP 27 + + +#define DOT11_UWNM_ACTION_TIM 0 +#define DOT11_UWNM_ACTION_TIMING_MEASUREMENT 1 #define DOT11_MNG_COUNTRY_ID_LEN 3 +#define DOT11_VHT_ACTION_CBF 0 +#define DOT11_VHT_ACTION_GID_MGMT 1 +#define DOT11_VHT_ACTION_OPER_MODE_NOTIF 2 + + BWL_PRE_PACKED_STRUCT struct dot11_dls_req { uint8 category; uint8 action; @@ -1326,83 +1458,528 @@ typedef struct dot11_dls_resp dot11_dls_resp_t; -BWL_PRE_PACKED_STRUCT struct dot11_bss_trans_query { + + +BWL_PRE_PACKED_STRUCT struct dot11_bsstrans_query { + uint8 category; + uint8 action; + uint8 token; + uint8 reason; + uint8 data[1]; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_bsstrans_query dot11_bsstrans_query_t; +#define DOT11_BSSTRANS_QUERY_LEN 4 + + +BWL_PRE_PACKED_STRUCT struct dot11_bsstrans_req { + uint8 category; + uint8 action; + uint8 token; + uint8 reqmode; + uint16 disassoc_tmr; + uint8 validity_intrvl; + uint8 data[1]; + +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_bsstrans_req dot11_bsstrans_req_t; +#define DOT11_BSSTRANS_REQ_LEN 7 + + +#define DOT11_BSSTRANS_REQMODE_PREF_LIST_INCL 0x01 +#define DOT11_BSSTRANS_REQMODE_ABRIDGED 0x02 +#define DOT11_BSSTRANS_REQMODE_DISASSOC_IMMINENT 0x04 +#define DOT11_BSSTRANS_REQMODE_BSS_TERM_INCL 0x08 +#define DOT11_BSSTRANS_REQMODE_ESS_DISASSOC_IMNT 0x10 + + +BWL_PRE_PACKED_STRUCT struct dot11_bsstrans_resp { + uint8 category; + uint8 action; + uint8 token; + uint8 status; + uint8 term_delay; + uint8 data[1]; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_bsstrans_resp dot11_bsstrans_resp_t; +#define DOT11_BSSTRANS_RESP_LEN 5 + + +#define DOT11_BSSTRANS_RESP_STATUS_ACCEPT 0 +#define DOT11_BSSTRANS_RESP_STATUS_REJECT 1 +#define DOT11_BSSTRANS_RESP_STATUS_REJ_INSUFF_BCN 2 +#define DOT11_BSSTRANS_RESP_STATUS_REJ_INSUFF_CAP 3 +#define DOT11_BSSTRANS_RESP_STATUS_REJ_TERM_UNDESIRED 4 +#define DOT11_BSSTRANS_RESP_STATUS_REJ_TERM_DELAY_REQ 5 +#define DOT11_BSSTRANS_RESP_STATUS_REJ_BSS_LIST_PROVIDED 6 +#define DOT11_BSSTRANS_RESP_STATUS_REJ_NO_SUITABLE_BSS 7 +#define DOT11_BSSTRANS_RESP_STATUS_REJ_LEAVING_ESS 8 + + + +BWL_PRE_PACKED_STRUCT struct dot11_bss_max_idle_period_ie { + uint8 id; + uint8 len; + uint16 max_idle_period; + uint8 idle_opt; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_bss_max_idle_period_ie dot11_bss_max_idle_period_ie_t; +#define DOT11_BSS_MAX_IDLE_PERIOD_IE_LEN 3 +#define DOT11_BSS_MAX_IDLE_PERIOD_OPT_PROTECTED 1 + + +BWL_PRE_PACKED_STRUCT struct dot11_timbc_req_ie { + uint8 id; + uint8 len; + uint8 interval; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_timbc_req_ie dot11_timbc_req_ie_t; +#define DOT11_TIMBC_REQ_IE_LEN 1 + + +BWL_PRE_PACKED_STRUCT struct dot11_timbc_req { + uint8 category; + uint8 action; + uint8 token; + uint8 data[1]; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_timbc_req dot11_timbc_req_t; +#define DOT11_TIMBC_REQ_LEN 3 + + +BWL_PRE_PACKED_STRUCT struct dot11_timbc_resp_ie { + uint8 id; + uint8 len; + uint8 status; + uint8 interval; + int32 offset; + uint16 high_rate; + uint16 low_rate; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_timbc_resp_ie dot11_timbc_resp_ie_t; +#define DOT11_TIMBC_DENY_RESP_IE_LEN 1 +#define DOT11_TIMBC_ACCEPT_RESP_IE_LEN 10 + +#define DOT11_TIMBC_STATUS_ACCEPT 0 +#define DOT11_TIMBC_STATUS_ACCEPT_TSTAMP 1 +#define DOT11_TIMBC_STATUS_DENY 2 +#define DOT11_TIMBC_STATUS_OVERRIDDEN 3 + + +BWL_PRE_PACKED_STRUCT struct dot11_timbc_resp { + uint8 category; + uint8 action; + uint8 token; + uint8 data[1]; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_timbc_resp dot11_timbc_resp_t; +#define DOT11_TIMBC_RESP_LEN 3 + + +BWL_PRE_PACKED_STRUCT struct dot11_tim_ie { + uint8 id; + uint8 len; + uint8 dtim_count; + uint8 dtim_period; + uint8 bitmap_control; + uint8 pvb[1]; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_tim_ie dot11_tim_ie_t; +#define DOT11_TIM_IE_FIXED_LEN 3 +#define DOT11_TIM_IE_FIXED_TOTAL_LEN 5 + + +BWL_PRE_PACKED_STRUCT struct dot11_timbc { + uint8 category; + uint8 action; + uint8 check_beacon; + uint8 tsf[8]; + dot11_tim_ie_t tim_ie; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_timbc dot11_timbc_t; +#define DOT11_TIMBC_HDR_LEN (sizeof(dot11_timbc_t) - sizeof(dot11_tim_ie_t)) +#define DOT11_TIMBC_FIXED_LEN (sizeof(dot11_timbc_t) - 1) +#define DOT11_TIMBC_LEN 11 + + +BWL_PRE_PACKED_STRUCT struct dot11_tclas_fc_hdr { + uint8 type; + uint8 mask; + uint8 data[1]; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_tclas_fc_hdr dot11_tclas_fc_hdr_t; +#define DOT11_TCLAS_FC_HDR_LEN 2 + +#define DOT11_TCLAS_MASK_0 0x1 +#define DOT11_TCLAS_MASK_1 0x2 +#define DOT11_TCLAS_MASK_2 0x4 +#define DOT11_TCLAS_MASK_3 0x8 +#define DOT11_TCLAS_MASK_4 0x10 +#define DOT11_TCLAS_MASK_5 0x20 +#define DOT11_TCLAS_MASK_6 0x40 +#define DOT11_TCLAS_MASK_7 0x80 + +#define DOT11_TCLAS_FC_0_ETH 0 +#define DOT11_TCLAS_FC_1_IP 1 +#define DOT11_TCLAS_FC_2_8021Q 2 +#define DOT11_TCLAS_FC_3_OFFSET 3 +#define DOT11_TCLAS_FC_4_IP_HIGHER 4 +#define DOT11_TCLAS_FC_5_8021D 5 + + +BWL_PRE_PACKED_STRUCT struct dot11_tclas_fc_0_eth { + uint8 type; + uint8 mask; + uint8 sa[ETHER_ADDR_LEN]; + uint8 da[ETHER_ADDR_LEN]; + uint16 eth_type; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_tclas_fc_0_eth dot11_tclas_fc_0_eth_t; +#define DOT11_TCLAS_FC_0_ETH_LEN 16 + + +BWL_PRE_PACKED_STRUCT struct dot11_tclas_fc_1_ipv4 { + uint8 type; + uint8 mask; + uint8 version; + uint32 src_ip; + uint32 dst_ip; + uint16 src_port; + uint16 dst_port; + uint8 dscp; + uint8 protocol; + uint8 reserved; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_tclas_fc_1_ipv4 dot11_tclas_fc_1_ipv4_t; +#define DOT11_TCLAS_FC_1_IPV4_LEN 18 + + +BWL_PRE_PACKED_STRUCT struct dot11_tclas_fc_2_8021q { + uint8 type; + uint8 mask; + uint16 tci; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_tclas_fc_2_8021q dot11_tclas_fc_2_8021q_t; +#define DOT11_TCLAS_FC_2_8021Q_LEN 4 + + +BWL_PRE_PACKED_STRUCT struct dot11_tclas_fc_3_filter { + uint8 type; + uint8 mask; + uint16 offset; + uint8 data[1]; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_tclas_fc_3_filter dot11_tclas_fc_3_filter_t; +#define DOT11_TCLAS_FC_3_FILTER_LEN 4 + + +typedef struct dot11_tclas_fc_1_ipv4 dot11_tclas_fc_4_ipv4_t; +#define DOT11_TCLAS_FC_4_IPV4_LEN DOT11_TCLAS_FC_1_IPV4_LEN + + +BWL_PRE_PACKED_STRUCT struct dot11_tclas_fc_4_ipv6 { + uint8 type; + uint8 mask; + uint8 version; + uint8 saddr[16]; + uint8 daddr[16]; + uint16 src_port; + uint16 dst_port; + uint8 dscp; + uint8 nexthdr; + uint8 flow_lbl[3]; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_tclas_fc_4_ipv6 dot11_tclas_fc_4_ipv6_t; +#define DOT11_TCLAS_FC_4_IPV6_LEN 44 + + +BWL_PRE_PACKED_STRUCT struct dot11_tclas_fc_5_8021d { + uint8 type; + uint8 mask; + uint8 pcp; + uint8 cfi; + uint16 vid; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_tclas_fc_5_8021d dot11_tclas_fc_5_8021d_t; +#define DOT11_TCLAS_FC_5_8021D_LEN 6 + + +BWL_PRE_PACKED_STRUCT union dot11_tclas_fc { + uint8 data[1]; + dot11_tclas_fc_hdr_t hdr; + dot11_tclas_fc_0_eth_t t0_eth; + dot11_tclas_fc_1_ipv4_t t1_ipv4; + dot11_tclas_fc_2_8021q_t t2_8021q; + dot11_tclas_fc_3_filter_t t3_filter; + dot11_tclas_fc_4_ipv4_t t4_ipv4; + dot11_tclas_fc_4_ipv6_t t4_ipv6; + dot11_tclas_fc_5_8021d_t t5_8021d; +} BWL_POST_PACKED_STRUCT; +typedef union dot11_tclas_fc dot11_tclas_fc_t; + +#define DOT11_TCLAS_FC_MIN_LEN 4 +#define DOT11_TCLAS_FC_MAX_LEN 254 + + +BWL_PRE_PACKED_STRUCT struct dot11_tclas_ie { + uint8 id; + uint8 len; + uint8 user_priority; + dot11_tclas_fc_t fc; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_tclas_ie dot11_tclas_ie_t; +#define DOT11_TCLAS_IE_LEN 3 + + +BWL_PRE_PACKED_STRUCT struct dot11_tclas_proc_ie { + uint8 id; + uint8 len; + uint8 process; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_tclas_proc_ie dot11_tclas_proc_ie_t; +#define DOT11_TCLAS_PROC_IE_LEN 3 + +#define DOT11_TCLAS_PROC_MATCHALL 0 +#define DOT11_TCLAS_PROC_MATCHONE 1 +#define DOT11_TCLAS_PROC_NONMATCH 2 + + + +#define DOT11_TSPEC_IE_LEN 57 + + +BWL_PRE_PACKED_STRUCT struct dot11_tfs_req_ie { + uint8 id; + uint8 len; + uint8 tfs_id; + uint8 tfs_actcode; + uint8 data[1]; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_tfs_req_ie dot11_tfs_req_ie_t; +#define DOT11_TFS_REQ_IE_LEN 4 + +#define DOT11_TFS_ACTCODE_DELETE 1 +#define DOT11_TFS_ACTCODE_MODIFY 2 + + +BWL_PRE_PACKED_STRUCT struct dot11_tfs_req_se { + uint8 sub_id; + uint8 length; + uint8 data[1]; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_tfs_req_se dot11_tfs_req_se_t; + +BWL_PRE_PACKED_STRUCT struct dot11_tfs_se { + uint8 sub_id; + uint8 len; + uint8 data[1]; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_tfs_se dot11_tfs_se_t; +#define DOT11_TFS_REQ_SUBELEM_LEN 2 + +#define DOT11_TFS_SUBELEM_ID_TFS 1 +#define DOT11_TFS_SUBELEM_ID_VENDOR 221 + + +BWL_PRE_PACKED_STRUCT struct dot11_tfs_resp_ie { + uint8 id; + uint8 len; + uint8 data[1]; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_tfs_resp_ie dot11_tfs_resp_ie_t; +#define DOT11_TFS_RESP_IE_LEN 2 + + +BWL_PRE_PACKED_STRUCT struct dot11_tfs_status_se { + uint8 id; + uint8 len; + uint8 resp_st; + uint8 tfs_id; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_tfs_status_se dot11_tfs_status_se_t; + +#define DOT11_TFS_STATUS_SE_LEN 4 +#define DOT11_TFS_STATUS_SE_DATA_LEN 2 + +#define DOT11_TFS_STATUS_SE_ID_TFS_ST 1 +#define DOT11_TFS_STATUS_SE_ID_TFS 2 +#define DOT11_TFS_STATUS_SE_ID_VENDOR 221 + +#define DOT11_TFS_RESP_ST_ACCEPT 0 +#define DOT11_TFS_RESP_ST_DENY_FORMAT 1 +#define DOT11_TFS_RESP_ST_DENY_RESOURCE 2 +#define DOT11_TFS_RESP_ST_DENY_POLICY 4 +#define DOT11_TFS_RESP_ST_PREFERRED_AP_INCAP 14 + + + +BWL_PRE_PACKED_STRUCT struct dot11_tfs_req { uint8 category; uint8 action; uint8 token; - uint8 reason; uint8 data[1]; } BWL_POST_PACKED_STRUCT; -typedef struct dot11_bss_trans_query dot11_bss_trans_query_t; -#define DOT11_BSS_TRANS_QUERY_LEN 4 +typedef struct dot11_tfs_req dot11_tfs_req_t; +#define DOT11_TFS_REQ_LEN 3 -BWL_PRE_PACKED_STRUCT struct dot11_bss_trans_req { +BWL_PRE_PACKED_STRUCT struct dot11_tfs_resp { uint8 category; uint8 action; uint8 token; - uint8 reqmode; - uint16 disassoc_tmr; - uint8 validity_intrvl; uint8 data[1]; - } BWL_POST_PACKED_STRUCT; -typedef struct dot11_bss_trans_req dot11_bss_trans_req_t; -#define DOT11_BSS_TRANS_REQ_LEN 7 +typedef struct dot11_tfs_resp dot11_tfs_resp_t; +#define DOT11_TFS_RESP_LEN 3 -#define DOT11_BSS_TERM_DUR_LEN 12 +BWL_PRE_PACKED_STRUCT struct dot11_tfs_notify { + uint8 category; + uint8 action; + uint8 num_tfs_id; + uint8 data[1]; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_tfs_notify dot11_tfs_notify_t; +#define DOT11_TFS_NOTIFY_LEN 3 +#define DOT11_TFS_NOTIFY_ACT_DEL 1 +#define DOT11_TFS_NOTIFY_ACT_NOTIFY 2 -#define DOT11_BSS_TRNS_REQMODE_PREF_LIST_INCL 0x01 -#define DOT11_BSS_TRNS_REQMODE_ABRIDGED 0x02 -#define DOT11_BSS_TRNS_REQMODE_DISASSOC_IMMINENT 0x04 -#define DOT11_BSS_TRNS_REQMODE_BSS_TERM_INCL 0x08 -#define DOT11_BSS_TRNS_REQMODE_ESS_DISASSOC_IMNT 0x10 +BWL_PRE_PACKED_STRUCT struct dot11_wnm_sleep_req { + uint8 category; + uint8 action; + uint8 token; + uint8 data[1]; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_wnm_sleep_req dot11_wnm_sleep_req_t; +#define DOT11_WNM_SLEEP_REQ_LEN 3 -BWL_PRE_PACKED_STRUCT struct dot11_bss_trans_res { +BWL_PRE_PACKED_STRUCT struct dot11_wnm_sleep_resp { + uint8 category; + uint8 action; + uint8 token; + uint16 key_len; + uint8 data[1]; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_wnm_sleep_resp dot11_wnm_sleep_resp_t; +#define DOT11_WNM_SLEEP_RESP_LEN 5 + +#define DOT11_WNM_SLEEP_SUBELEM_ID_GTK 0 +#define DOT11_WNM_SLEEP_SUBELEM_ID_IGTK 1 + +BWL_PRE_PACKED_STRUCT struct dot11_wnm_sleep_subelem_gtk { + uint8 sub_id; + uint8 len; + uint16 key_info; + uint8 key_length; + uint8 rsc[8]; + uint8 key[1]; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_wnm_sleep_subelem_gtk dot11_wnm_sleep_subelem_gtk_t; +#define DOT11_WNM_SLEEP_SUBELEM_GTK_FIXED_LEN 11 +#define DOT11_WNM_SLEEP_SUBELEM_GTK_MAX_LEN 43 + +BWL_PRE_PACKED_STRUCT struct dot11_wnm_sleep_subelem_igtk { + uint8 sub_id; + uint8 len; + uint16 key_id; + uint8 pn[6]; + uint8 key[16]; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_wnm_sleep_subelem_igtk dot11_wnm_sleep_subelem_igtk_t; +#define DOT11_WNM_SLEEP_SUBELEM_IGTK_LEN 24 + +BWL_PRE_PACKED_STRUCT struct dot11_wnm_sleep_ie { + uint8 id; + uint8 len; + uint8 act_type; + uint8 resp_status; + uint16 interval; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_wnm_sleep_ie dot11_wnm_sleep_ie_t; +#define DOT11_WNM_SLEEP_IE_LEN 4 + +#define DOT11_WNM_SLEEP_ACT_TYPE_ENTER 0 +#define DOT11_WNM_SLEEP_ACT_TYPE_EXIT 1 + +#define DOT11_WNM_SLEEP_RESP_ACCEPT 0 +#define DOT11_WNM_SLEEP_RESP_UPDATE 1 +#define DOT11_WNM_SLEEP_RESP_DENY 2 +#define DOT11_WNM_SLEEP_RESP_DENY_TEMP 3 +#define DOT11_WNM_SLEEP_RESP_DENY_KEY 4 +#define DOT11_WNM_SLEEP_RESP_DENY_INUSE 5 +#define DOT11_WNM_SLEEP_RESP_LAST 6 + + +BWL_PRE_PACKED_STRUCT struct dot11_dms_req { uint8 category; uint8 action; uint8 token; - uint8 status; - uint8 term_delay; uint8 data[1]; - } BWL_POST_PACKED_STRUCT; -typedef struct dot11_bss_trans_res dot11_bss_trans_res_t; -#define DOT11_BSS_TRANS_RES_LEN 5 +typedef struct dot11_dms_req dot11_dms_req_t; +#define DOT11_DMS_REQ_LEN 3 + +BWL_PRE_PACKED_STRUCT struct dot11_dms_resp { + uint8 category; + uint8 action; + uint8 token; + uint8 data[1]; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_dms_resp dot11_dms_resp_t; +#define DOT11_DMS_RESP_LEN 3 -#define DOT11_BSS_TRNS_RES_STATUS_ACCEPT 0 -#define DOT11_BSS_TRNS_RES_STATUS_REJECT 1 -#define DOT11_BSS_TRNS_RES_STATUS_REJ_INSUFF_BCN 2 -#define DOT11_BSS_TRNS_RES_STATUS_REJ_INSUFF_CAP 3 -#define DOT11_BSS_TRNS_RES_STATUS_REJ_TERM_UNDESIRED 4 -#define DOT11_BSS_TRNS_RES_STATUS_REJ_TERM_DELAY_REQ 5 -#define DOT11_BSS_TRNS_RES_STATUS_REJ_BSS_LIST_PROVIDED 6 -#define DOT11_BSS_TRNS_RES_STATUS_REJ_NO_SUITABLE_BSS 7 -#define DOT11_BSS_TRNS_RES_STATUS_REJ_LEAVING_ESS 8 +BWL_PRE_PACKED_STRUCT struct dot11_dms_req_ie { + uint8 id; + uint8 len; + uint8 data[1]; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_dms_req_ie dot11_dms_req_ie_t; +#define DOT11_DMS_REQ_IE_LEN 2 -#define DOT11_NBR_RPRT_BSSID_INFO_REACHABILTY 0x0003 -#define DOT11_NBR_RPRT_BSSID_INFO_SEC 0x0004 -#define DOT11_NBR_RPRT_BSSID_INFO_KEY_SCOPE 0x0008 -#define DOT11_NBR_RPRT_BSSID_INFO_CAP 0x03f0 +BWL_PRE_PACKED_STRUCT struct dot11_dms_resp_ie { + uint8 id; + uint8 len; + uint8 data[1]; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_dms_resp_ie dot11_dms_resp_ie_t; +#define DOT11_DMS_RESP_IE_LEN 2 -#define DOT11_NBR_RPRT_BSSID_INFO_CAP_SPEC_MGMT 0x0010 -#define DOT11_NBR_RPRT_BSSID_INFO_CAP_QOS 0x0020 -#define DOT11_NBR_RPRT_BSSID_INFO_CAP_APSD 0x0040 -#define DOT11_NBR_RPRT_BSSID_INFO_CAP_RDIO_MSMT 0x0080 -#define DOT11_NBR_RPRT_BSSID_INFO_CAP_DEL_BA 0x0100 -#define DOT11_NBR_RPRT_BSSID_INFO_CAP_IMM_BA 0x0200 +BWL_PRE_PACKED_STRUCT struct dot11_dms_req_desc { + uint8 dms_id; + uint8 len; + uint8 type; + uint8 data[1]; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_dms_req_desc dot11_dms_req_desc_t; +#define DOT11_DMS_REQ_DESC_LEN 3 -#define DOT11_NBR_RPRT_SUBELEM_BSS_CANDDT_PREF_ID 3 +#define DOT11_DMS_REQ_TYPE_ADD 0 +#define DOT11_DMS_REQ_TYPE_REMOVE 1 +#define DOT11_DMS_REQ_TYPE_CHANGE 2 +BWL_PRE_PACKED_STRUCT struct dot11_dms_resp_st { + uint8 dms_id; + uint8 len; + uint8 type; + uint16 lsc; + uint8 data[1]; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_dms_resp_st dot11_dms_resp_st_t; +#define DOT11_DMS_RESP_STATUS_LEN 5 + +#define DOT11_DMS_RESP_TYPE_ACCEPT 0 +#define DOT11_DMS_RESP_TYPE_DENY 1 +#define DOT11_DMS_RESP_TYPE_TERM 2 + +#define DOT11_DMS_RESP_LSC_UNSUPPORTED 0xFFFF + BWL_PRE_PACKED_STRUCT struct dot11_addba_req { uint8 category; uint8 action; @@ -1470,6 +2047,19 @@ typedef struct dot11_ft_res dot11_ft_res_t; #define DOT11_FT_RES_FIXED_LEN 16 +BWL_PRE_PACKED_STRUCT struct dot11_rde_ie { + uint8 id; + uint8 length; + uint8 rde_id; + uint8 rd_count; + uint16 status; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_rde_ie dot11_rde_ie_t; + + +#define DOT11_MNG_RDE_IE_LEN sizeof(dot11_rde_ie_t) + + @@ -1497,6 +2087,13 @@ typedef struct dot11_rrm_cap_ie dot11_rrm_cap_ie_t; #define DOT11_OP_CLASS_NONE 255 +BWL_PRE_PACKED_STRUCT struct do11_ap_chrep { + uint8 id; + uint8 len; + uint8 reg; + uint8 chanlist[1]; +} BWL_POST_PACKED_STRUCT; +typedef struct do11_ap_chrep dot11_ap_chrep_t; #define DOT11_RM_ACTION_RM_REQ 0 @@ -1585,11 +2182,11 @@ typedef struct dot11_rmrep_bcn dot11_rmrep_bcn_t; #define DOT11_RMREQ_BCN_TABLE 2 -#define DOT11_RMREQ_BCN_SSID_ID 0 -#define DOT11_RMREQ_BCN_REPINFO_ID 1 -#define DOT11_RMREQ_BCN_REPDET_ID 2 -#define DOT11_RMREQ_BCN_REQUEST_ID 10 -#define DOT11_RMREQ_BCN_APCHREP_ID 51 +#define DOT11_RMREQ_BCN_SSID_ID 0 +#define DOT11_RMREQ_BCN_REPINFO_ID 1 +#define DOT11_RMREQ_BCN_REPDET_ID 2 +#define DOT11_RMREQ_BCN_REQUEST_ID 10 +#define DOT11_RMREQ_BCN_APCHREP_ID DOT11_MNG_AP_CHREP_ID #define DOT11_RMREQ_BCN_REPDET_FIXED 0 @@ -1780,25 +2377,61 @@ BWL_PRE_PACKED_STRUCT struct dot11_rmreq_pause_time { typedef struct dot11_rmreq_pause_time dot11_rmreq_pause_time_t; -BWL_PRE_PACKED_STRUCT struct dot11_rmrep_nbr { - struct ether_addr bssid; - uint32 bssid_info; - uint8 reg; - uint8 channel; - uint8 phytype; - uchar sub_elements[1]; + +#define DOT11_NGBR_TSF_INFO_SE_ID 1 +#define DOT11_NGBR_CCS_SE_ID 2 +#define DOT11_NGBR_BSSTRANS_PREF_SE_ID 3 +#define DOT11_NGBR_BSS_TERM_DUR_SE_ID 4 +#define DOT11_NGBR_BEARING_SE_ID 5 + + +BWL_PRE_PACKED_STRUCT struct dot11_ngbr_bsstrans_pref_se { + uint8 sub_id; + uint8 len; + uint8 preference; } BWL_POST_PACKED_STRUCT; -typedef struct dot11_rmrep_nbr dot11_rmrep_nbr_t; -#define DOT11_RMREP_NBR_LEN 13 +typedef struct dot11_ngbr_bsstrans_pref_se dot11_ngbr_bsstrans_pref_se_t; +#define DOT11_NGBR_BSSTRANS_PREF_SE_LEN 1 + + +BWL_PRE_PACKED_STRUCT struct dot11_ngbr_bss_term_dur_se { + uint8 sub_id; + uint8 len; + uint8 tsf[8]; + uint16 duration; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_ngbr_bss_term_dur_se dot11_ngbr_bss_term_dur_se_t; +#define DOT11_NGBR_BSS_TERM_DUR_SE_LEN 10 + +#define DOT11_NGBR_BI_REACHABILTY_UNKN 0x0002 +#define DOT11_NGBR_BI_REACHABILTY 0x0003 +#define DOT11_NGBR_BI_SEC 0x0004 +#define DOT11_NGBR_BI_KEY_SCOPE 0x0008 +#define DOT11_NGBR_BI_CAP 0x03f0 +#define DOT11_NGBR_BI_CAP_SPEC_MGMT 0x0010 +#define DOT11_NGBR_BI_CAP_QOS 0x0020 +#define DOT11_NGBR_BI_CAP_APSD 0x0040 +#define DOT11_NGBR_BI_CAP_RDIO_MSMT 0x0080 +#define DOT11_NGBR_BI_CAP_DEL_BA 0x0100 +#define DOT11_NGBR_BI_CAP_IMM_BA 0x0200 +#define DOT11_NGBR_BI_MOBILITY 0x0400 +#define DOT11_NGBR_BI_HT 0x0800 -BWL_PRE_PACKED_STRUCT struct dot11_rrmrep_nbr { + +BWL_PRE_PACKED_STRUCT struct dot11_neighbor_rep_ie { uint8 id; uint8 len; - dot11_rmrep_nbr_t nbr_rrmrep; + struct ether_addr bssid; + uint32 bssid_info; + uint8 reg; + uint8 channel; + uint8 phytype; + uint8 data[1]; } BWL_POST_PACKED_STRUCT; -typedef struct dot11_rrmrep_nbr dot11_rrmrep_nbr_t; -#define DOT11_RRMREP_NBR_LEN 15 +typedef struct dot11_neighbor_rep_ie dot11_neighbor_rep_ie_t; +#define DOT11_NEIGHBOR_REP_IE_FIXED_LEN 13 + #define DOT11_BSSTYPE_INFRASTRUCTURE 0 @@ -1870,27 +2503,27 @@ typedef struct dot11_lmrep dot11_lmrep_t; #define HT_T_GF_STF 8 #define HT_T_SYML 4 -#define HT_N_SERVICE 16 -#define HT_N_TAIL 6 +#define HT_N_SERVICE 16 +#define HT_N_TAIL 6 -#define APHY_SLOT_TIME 9 -#define APHY_SIFS_TIME 16 -#define APHY_DIFS_TIME (APHY_SIFS_TIME + (2 * APHY_SLOT_TIME)) -#define APHY_PREAMBLE_TIME 16 -#define APHY_SIGNAL_TIME 4 -#define APHY_SYMBOL_TIME 4 -#define APHY_SERVICE_NBITS 16 -#define APHY_TAIL_NBITS 6 -#define APHY_CWMIN 15 +#define APHY_SLOT_TIME 9 +#define APHY_SIFS_TIME 16 +#define APHY_DIFS_TIME (APHY_SIFS_TIME + (2 * APHY_SLOT_TIME)) +#define APHY_PREAMBLE_TIME 16 +#define APHY_SIGNAL_TIME 4 +#define APHY_SYMBOL_TIME 4 +#define APHY_SERVICE_NBITS 16 +#define APHY_TAIL_NBITS 6 +#define APHY_CWMIN 15 -#define BPHY_SLOT_TIME 20 -#define BPHY_SIFS_TIME 10 -#define BPHY_DIFS_TIME 50 -#define BPHY_PLCP_TIME 192 -#define BPHY_PLCP_SHORT_TIME 96 -#define BPHY_CWMIN 31 +#define BPHY_SLOT_TIME 20 +#define BPHY_SIFS_TIME 10 +#define BPHY_DIFS_TIME 50 +#define BPHY_PLCP_TIME 192 +#define BPHY_PLCP_SHORT_TIME 96 +#define BPHY_CWMIN 31 #define DOT11_OFDM_SIGNAL_EXTENSION 6 @@ -1951,8 +2584,8 @@ typedef int vht_group_id_t; #define VHT_T_SIG_B 4 #define VHT_T_SYML 4 -#define VHT_N_SERVICE 16 -#define VHT_N_TAIL 6 +#define VHT_N_SERVICE 16 +#define VHT_N_TAIL 6 @@ -1978,7 +2611,7 @@ typedef struct d11cnt { -#define BRCM_SYSCAP_WET_TUNNEL 0x0100 +#define BRCM_SYSCAP_WET_TUNNEL 0x0100 #define BRCM_OUI "\x00\x10\x18" @@ -2010,7 +2643,7 @@ typedef struct brcm_ie brcm_ie_t; #define BRF1_RX_LARGE_AGG 0x10 #define BRF1_RFAWARE_DCS 0x20 #define BRF1_SOFTAP 0x40 -#define BRF1_DWDS 0x80 +#define BRF1_DWDS 0x80 BWL_PRE_PACKED_STRUCT struct vndr_ie { @@ -2024,7 +2657,36 @@ typedef struct vndr_ie vndr_ie_t; #define VNDR_IE_HDR_LEN 2 #define VNDR_IE_MIN_LEN 3 #define VNDR_IE_FIXED_LEN (VNDR_IE_HDR_LEN + VNDR_IE_MIN_LEN) -#define VNDR_IE_MAX_LEN 256 + +#define VNDR_IE_MAX_LEN 255 + + +BWL_PRE_PACKED_STRUCT struct member_of_brcm_prop_ie { + uchar id; + uchar len; + uchar oui[3]; + uint8 type; + struct ether_addr ea; +} BWL_POST_PACKED_STRUCT; +typedef struct member_of_brcm_prop_ie member_of_brcm_prop_ie_t; + +#define MEMBER_OF_BRCM_PROP_IE_LEN 10 +#define MEMBER_OF_BRCM_PROP_IE_TYPE 54 + + +BWL_PRE_PACKED_STRUCT struct relmcast_brcm_prop_ie { + uchar id; + uchar len; + uchar oui[3]; + uint8 type; + struct ether_addr ea; + struct ether_addr mcast_ea; + uint8 updtmo; +} BWL_POST_PACKED_STRUCT; +typedef struct relmcast_brcm_prop_ie relmcast_brcm_prop_ie_t; + +#define RELMCAST_BRCM_PROP_IE_LEN (sizeof(relmcast_brcm_prop_ie_t)-2) +#define RELMCAST_BRCM_PROP_IE_TYPE 55 #define MCSSET_LEN 16 @@ -2040,6 +2702,13 @@ BWL_PRE_PACKED_STRUCT struct ht_cap_ie { } BWL_POST_PACKED_STRUCT; typedef struct ht_cap_ie ht_cap_ie_t; +BWL_PRE_PACKED_STRUCT struct dot11_ht_cap_ie { + uint8 id; + uint8 len; + ht_cap_ie_t ht_cap; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_ht_cap_ie dot11_ht_cap_ie_t; + BWL_PRE_PACKED_STRUCT struct ht_prop_cap_ie { @@ -2081,6 +2750,37 @@ typedef struct ht_prop_cap_ie ht_prop_cap_ie_t; #define HT_CAP_RX_STBC_TWO_STREAM 0x2 #define HT_CAP_RX_STBC_THREE_STREAM 0x3 + +#define HT_CAP_TXBF_CAP_IMPLICIT_TXBF_RX 0x1 +#define HT_CAP_TXBF_CAP_NDP_TX 0x8 +#define HT_CAP_TXBF_CAP_NDP_RX 0x10 +#define HT_CAP_TXBF_CAP_EXPLICIT_CSI 0x100 +#define HT_CAP_TXBF_CAP_EXPLICIT_NC_STEERING 0x200 +#define HT_CAP_TXBF_CAP_EXPLICIT_C_STEERING 0x400 +#define HT_CAP_TXBF_CAP_EXPLICIT_CSI_FB_MASK 0x1800 +#define HT_CAP_TXBF_CAP_EXPLICIT_CSI_FB_SHIFT 11 +#define HT_CAP_TXBF_CAP_EXPLICIT_NC_FB_MASK 0x6000 +#define HT_CAP_TXBF_CAP_EXPLICIT_NC_FB_SHIFT 13 +#define HT_CAP_TXBF_CAP_EXPLICIT_C_FB_MASK 0x18000 +#define HT_CAP_TXBF_CAP_EXPLICIT_C_FB_SHIFT 15 +#define HT_CAP_TXBF_CAP_CSI_BFR_ANT_SHIFT 19 +#define HT_CAP_TXBF_CAP_NC_BFR_ANT_SHIFT 21 +#define HT_CAP_TXBF_CAP_C_BFR_ANT_SHIFT 23 +#define HT_CAP_TXBF_CAP_C_BFR_ANT_MASK 0x1800000 + +#define HT_CAP_TXBF_CAP_CHAN_ESTIM_SHIFT 27 +#define HT_CAP_TXBF_CAP_CHAN_ESTIM_MASK 0x18000000 + +#define HT_CAP_TXBF_FB_TYPE_NONE 0 +#define HT_CAP_TXBF_FB_TYPE_DELAYED 1 +#define HT_CAP_TXBF_FB_TYPE_IMMEDIATE 2 +#define HT_CAP_TXBF_FB_TYPE_BOTH 3 + +#define HT_CAP_TX_BF_CAP_EXPLICIT_CSI_FB_MASK 0x400 +#define HT_CAP_TX_BF_CAP_EXPLICIT_CSI_FB_SHIFT 10 +#define HT_CAP_TX_BF_CAP_EXPLICIT_COMPRESSED_FB_MASK 0x18000 +#define HT_CAP_TX_BF_CAP_EXPLICIT_COMPRESSED_FB_SHIFT 15 + #define VHT_MAX_MPDU 11454 #define VHT_MPDU_MSDU_DELTA 56 @@ -2291,8 +2991,8 @@ typedef struct vht_cap_ie vht_cap_ie_t; #define VHT_CAP_MCS_MAP_0_8 1 #define VHT_CAP_MCS_MAP_0_9 2 #define VHT_CAP_MCS_MAP_NONE 3 -#define VHT_CAP_MCS_MAP_S 2 -#define VHT_CAP_MCS_MAP_M 0x3 +#define VHT_CAP_MCS_MAP_S 2 +#define VHT_CAP_MCS_MAP_M 0x3 #define VHT_CAP_MCS_MAP_NONE_ALL 0xffff @@ -2365,11 +3065,13 @@ typedef enum vht_op_chan_width { } vht_op_chan_width_t; -#define BRCM_VHT_FEATURES_OUITYPE 0x4 +#define AID_IE_LEN 2 + +#define VHT_FEATURES_IE_TYPE 0x4 BWL_PRE_PACKED_STRUCT struct vht_features_ie_hdr { - uint8 oui[3]; - uint8 type; - uint8 rate_mask; + uint8 oui[3]; + uint8 type; + uint8 rate_mask; } BWL_POST_PACKED_STRUCT; typedef struct vht_features_ie_hdr vht_features_ie_hdr_t; @@ -2388,8 +3090,8 @@ typedef struct vht_features_ie_hdr vht_features_ie_hdr_t; #define WPA_OUI "\x00\x50\xF2" +#define WPA_OUI_LEN 3 #define WPA_OUI_TYPE 1 -#define WPA_OUI_LEN 3 #define WPA_VERSION 1 #define WPA2_OUI "\x00\x0F\xAC" #define WPA2_OUI_LEN 3 @@ -2412,15 +3114,17 @@ typedef struct vht_features_ie_hdr vht_features_ie_hdr_t; #ifdef P2P_IE_OVRD #define WFA_OUI_TYPE_P2P MAC_OUI_TYPE_P2P #else +#define WFA_OUI_TYPE_TPC 8 #define WFA_OUI_TYPE_P2P 9 #endif #define WFA_OUI_TYPE_TPC 8 #ifdef WLTDLS -#define WFA_OUI_TYPE_TPQ 4 -#define WFA_OUI_TYPE_TPS 5 +#define WFA_OUI_TYPE_TPQ 4 +#define WFA_OUI_TYPE_TPS 5 #define WFA_OUI_TYPE_WFD 10 #endif +#define WFA_OUI_TYPE_HS20 0x10 #define RSN_AKM_NONE 0 @@ -2454,7 +3158,7 @@ typedef struct vht_features_ie_hdr vht_features_ie_hdr_t; #define AES_KEY_SIZE 16 #define AES_MIC_SIZE 8 #define BIP_KEY_SIZE 16 -#define BIP_MIC_SIZE 8 +#define BIP_MIC_SIZE 8 #define WCN_OUI "\x00\x50\xf2" @@ -2515,11 +3219,11 @@ typedef struct dot11_gtk_ie dot11_gtk_ie_t; BWL_PRE_PACKED_STRUCT struct mmic_ie { - uint8 id; - uint8 len; - uint16 key_id; - uint8 ipn[6]; - uint8 mic[BIP_MIC_SIZE]; + uint8 id; + uint8 len; + uint16 key_id; + uint8 ipn[6]; + uint8 mic[BIP_MIC_SIZE]; } BWL_POST_PACKED_STRUCT; typedef struct mmic_ie mmic_ie_t; @@ -2603,6 +3307,156 @@ typedef struct pu_buffer_status_ie pu_buffer_status_ie_t; #define TDLS_PU_BUFFER_STATUS_AC_VO 8 +#define GAS_REQUEST_ACTION_FRAME 10 +#define GAS_RESPONSE_ACTION_FRAME 11 +#define GAS_COMEBACK_REQUEST_ACTION_FRAME 12 +#define GAS_COMEBACK_RESPONSE_ACTION_FRAME 13 + + +#define IW_ANT_MASK 0x0f +#define IW_INTERNET_MASK 0x10 +#define IW_ASRA_MASK 0x20 +#define IW_ESR_MASK 0x40 +#define IW_UESA_MASK 0x80 + + +#define IW_ANT_PRIVATE_NETWORK 0 +#define IW_ANT_PRIVATE_NETWORK_WITH_GUEST 1 +#define IW_ANT_CHARGEABLE_PUBLIC_NETWORK 2 +#define IW_ANT_FREE_PUBLIC_NETWORK 3 +#define IW_ANT_PERSONAL_DEVICE_NETWORK 4 +#define IW_ANT_EMERGENCY_SERVICES_NETWORK 5 +#define IW_ANT_TEST_NETWORK 14 +#define IW_ANT_WILDCARD_NETWORK 15 + + +#define ADVP_ANQP_PROTOCOL_ID 0 + + +#define ADVP_QRL_MASK 0x7f +#define ADVP_PAME_BI_MASK 0x80 + + +#define ADVP_QRL_REQUEST 0x00 +#define ADVP_QRL_RESPONSE 0x7f +#define ADVP_PAME_BI_DEPENDENT 0x00 +#define ADVP_PAME_BI_INDEPENDENT ADVP_PAME_BI_MASK + + +#define ANQP_ID_QUERY_LIST 256 +#define ANQP_ID_CAPABILITY_LIST 257 +#define ANQP_ID_VENUE_NAME_INFO 258 +#define ANQP_ID_EMERGENCY_CALL_NUMBER_INFO 259 +#define ANQP_ID_NETWORK_AUTHENTICATION_TYPE_INFO 260 +#define ANQP_ID_ROAMING_CONSORTIUM_LIST 261 +#define ANQP_ID_IP_ADDRESS_TYPE_AVAILABILITY_INFO 262 +#define ANQP_ID_NAI_REALM_LIST 263 +#define ANQP_ID_G3PP_CELLULAR_NETWORK_INFO 264 +#define ANQP_ID_AP_GEOSPATIAL_LOCATION 265 +#define ANQP_ID_AP_CIVIC_LOCATION 266 +#define ANQP_ID_AP_LOCATION_PUBLIC_ID_URI 267 +#define ANQP_ID_DOMAIN_NAME_LIST 268 +#define ANQP_ID_EMERGENCY_ALERT_ID_URI 269 +#define ANQP_ID_EMERGENCY_NAI 271 +#define ANQP_ID_VENDOR_SPECIFIC_LIST 56797 + + +#define ANQP_OUI_SUBTYPE 9 + + +#define VENUE_LANGUAGE_CODE_SIZE 3 +#define VENUE_NAME_SIZE 255 + + +#define VENUE_UNSPECIFIED 0 +#define VENUE_ASSEMBLY 1 +#define VENUE_BUSINESS 2 +#define VENUE_EDUCATIONAL 3 +#define VENUE_FACTORY 4 +#define VENUE_INSTITUTIONAL 5 +#define VENUE_MERCANTILE 6 +#define VENUE_RESIDENTIAL 7 +#define VENUE_STORAGE 8 +#define VENUE_UTILITY 9 +#define VENUE_VEHICULAR 10 +#define VENUE_OUTDOOR 11 + + +#define NATI_ACCEPTANCE_OF_TERMS_CONDITIONS 0 +#define NATI_ONLINE_ENROLLMENT_SUPPORTED 1 +#define NATI_HTTP_HTTPS_REDIRECTION 2 +#define NATI_DNS_REDIRECTION 3 + + +#define IPA_IPV6_SHIFT 0 +#define IPA_IPV6_MASK (0x03 << IPA_IPV6_SHIFT) +#define IPA_IPV6_NOT_AVAILABLE 0x00 +#define IPA_IPV6_AVAILABLE 0x01 +#define IPA_IPV6_UNKNOWN_AVAILABILITY 0x02 + + +#define IPA_IPV4_SHIFT 2 +#define IPA_IPV4_MASK (0x3f << IPA_IPV4_SHIFT) +#define IPA_IPV4_NOT_AVAILABLE 0x00 +#define IPA_IPV4_PUBLIC 0x01 +#define IPA_IPV4_PORT_RESTRICT 0x02 +#define IPA_IPV4_SINGLE_NAT 0x03 +#define IPA_IPV4_DOUBLE_NAT 0x04 +#define IPA_IPV4_PORT_RESTRICT_SINGLE_NAT 0x05 +#define IPA_IPV4_PORT_RESTRICT_DOUBLE_NAT 0x06 +#define IPA_IPV4_UNKNOWN_AVAILABILITY 0x07 + + +#define REALM_ENCODING_RFC4282 0 +#define REALM_ENCODING_UTF8 1 + + +#define REALM_EAP_TLS 13 +#define REALM_EAP_SIM 18 +#define REALM_EAP_TTLS 21 +#define REALM_EAP_AKA 23 +#define REALM_EAP_PSK 47 +#define REALM_EAP_AKAP 50 + + +#define REALM_EXPANDED_EAP 1 +#define REALM_NON_EAP_INNER_AUTHENTICATION 2 +#define REALM_INNER_AUTHENTICATION_EAP 3 +#define REALM_EXPANDED_INNER_EAP 4 +#define REALM_CREDENTIAL 5 +#define REALM_TUNNELED_EAP_CREDENTIAL 6 +#define REALM_VENDOR_SPECIFIC_EAP 221 + + +#define REALM_PAP 1 +#define REALM_CHAP 2 +#define REALM_MSCHAP 3 +#define REALM_MSCHAPV2 4 + + +#define REALM_SIM 1 +#define REALM_USIM 2 +#define REALM_NFC 3 +#define REALM_HARDWARE_TOKEN 4 +#define REALM_SOFTOKEN 5 +#define REALM_CERTIFICATE 6 +#define REALM_USERNAME_PASSWORD 7 +#define REALM_SERVER_SIDE 8 + + +#define G3PP_GUD_VERSION 0 +#define G3PP_PLMN_LIST_IE 0 + + +BWL_PRE_PACKED_STRUCT struct hs20_ie { + uint8 oui[3]; + uint8 type; + uint8 config; +} BWL_POST_PACKED_STRUCT; +typedef struct hs20_ie hs20_ie_t; +#define HS20_IE_LEN 5 + + #include #endif diff --git a/drivers/net/wireless/bcmdhd/include/proto/802.11_bta.h b/drivers/net/wireless/bcmdhd/include/proto/802.11_bta.h index 3ee5a748695..ee7f9593ca4 100644 --- a/drivers/net/wireless/bcmdhd/include/proto/802.11_bta.h +++ b/drivers/net/wireless/bcmdhd/include/proto/802.11_bta.h @@ -1,7 +1,7 @@ /* * BT-AMP (BlueTooth Alternate Mac and Phy) 802.11 PAL (Protocol Adaptation Layer) * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -21,7 +21,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: 802.11_bta.h 294267 2011-11-04 23:41:52Z $ + * $Id: 802.11_bta.h 382882 2013-02-04 23:24:31Z $ */ #ifndef _802_11_BTA_H_ diff --git a/drivers/net/wireless/bcmdhd/include/proto/802.11e.h b/drivers/net/wireless/bcmdhd/include/proto/802.11e.h index c837f57c3bf..6f0114e7fda 100644 --- a/drivers/net/wireless/bcmdhd/include/proto/802.11e.h +++ b/drivers/net/wireless/bcmdhd/include/proto/802.11e.h @@ -1,7 +1,7 @@ /* * 802.11e protocol header file * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -21,7 +21,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: 802.11e.h 241182 2011-02-17 21:50:03Z $ + * $Id: 802.11e.h 382883 2013-02-04 23:26:09Z $ */ #ifndef _802_11e_H_ @@ -110,7 +110,8 @@ typedef BWL_PRE_PACKED_STRUCT struct tspec { #define QBSS_LOAD_IE_LEN 5 /* QBSS Load IE length */ #define QBSS_LOAD_AAC_OFF 3 /* AAC offset in IE */ -#define CAC_ADDTS_RESP_TIMEOUT 300 /* default ADDTS response timeout in ms */ +#define CAC_ADDTS_RESP_TIMEOUT 1000 /* default ADDTS response timeout in ms */ + /* DEFVAL dot11ADDTSResponseTimeout = 1s */ /* 802.11e ADDTS status code */ #define DOT11E_STATUS_ADMISSION_ACCEPTED 0 /* TSPEC Admission accepted status */ diff --git a/drivers/net/wireless/bcmdhd/include/proto/802.1d.h b/drivers/net/wireless/bcmdhd/include/proto/802.1d.h index 116a226b1b4..3324f7b6744 100644 --- a/drivers/net/wireless/bcmdhd/include/proto/802.1d.h +++ b/drivers/net/wireless/bcmdhd/include/proto/802.1d.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -21,7 +21,7 @@ * * Fundamental types and constants relating to 802.1D * - * $Id: 802.1d.h 241182 2011-02-17 21:50:03Z $ + * $Id: 802.1d.h 382882 2013-02-04 23:24:31Z $ */ #ifndef _802_1_D_ diff --git a/drivers/net/wireless/bcmdhd/include/proto/802.3.h b/drivers/net/wireless/bcmdhd/include/proto/802.3.h new file mode 100644 index 00000000000..91dc342c6b1 --- /dev/null +++ b/drivers/net/wireless/bcmdhd/include/proto/802.3.h @@ -0,0 +1,52 @@ +/* + * Copyright (C) 1999-2013, Broadcom Corporation + * + * Unless you and Broadcom execute a separate written software license + * agreement governing use of this software, this software is licensed to you + * under the terms of the GNU General Public License version 2 (the "GPL"), + * available at http://www.broadcom.com/licenses/GPLv2.php, with the + * following added to such license: + * + * As a special exception, the copyright holders of this software give you + * permission to link this software with independent modules, and to copy and + * distribute the resulting executable under terms of your choice, provided that + * you also meet, for each linked independent module, the terms and conditions of + * the license of that module. An independent module is a module which is not + * derived from this software. The special exception does not apply to any + * modifications of the software. + * + * Notwithstanding the above, under no circumstances may you combine this + * software in any way with any other Broadcom software provided under a license + * other than the GPL, without Broadcom's express prior written consent. + * + * Fundamental constants relating to 802.3 + * + * $Id: 802.3.h 417942 2013-08-13 07:53:57Z $ + */ + +#ifndef _802_3_h_ +#define _802_3_h_ + +/* This marks the start of a packed structure section. */ +#include + +#define SNAP_HDR_LEN 6 /* 802.3 SNAP header length */ +#define DOT3_OUI_LEN 3 /* 802.3 oui length */ + +BWL_PRE_PACKED_STRUCT struct dot3_mac_llc_snap_header { + uint8 ether_dhost[ETHER_ADDR_LEN]; /* dest mac */ + uint8 ether_shost[ETHER_ADDR_LEN]; /* src mac */ + uint16 length; /* frame length incl header */ + uint8 dsap; /* always 0xAA */ + uint8 ssap; /* always 0xAA */ + uint8 ctl; /* always 0x03 */ + uint8 oui[DOT3_OUI_LEN]; /* RFC1042: 0x00 0x00 0x00 + * Bridge-Tunnel: 0x00 0x00 0xF8 + */ + uint16 type; /* ethertype */ +} BWL_POST_PACKED_STRUCT; + +/* This marks the end of a packed structure section. */ +#include + +#endif /* #ifndef _802_3_h_ */ diff --git a/drivers/net/wireless/bcmdhd/include/proto/bcmeth.h b/drivers/net/wireless/bcmdhd/include/proto/bcmeth.h index e54b2e38187..d03bf7d4bea 100644 --- a/drivers/net/wireless/bcmdhd/include/proto/bcmeth.h +++ b/drivers/net/wireless/bcmdhd/include/proto/bcmeth.h @@ -1,7 +1,7 @@ /* * Broadcom Ethernettype protocol definitions * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -21,7 +21,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: bcmeth.h 294352 2011-11-06 19:23:00Z $ + * $Id: bcmeth.h 382882 2013-02-04 23:24:31Z $ */ diff --git a/drivers/net/wireless/bcmdhd/include/proto/bcmevent.h b/drivers/net/wireless/bcmdhd/include/proto/bcmevent.h index 1d69529ac4b..cafbc1df7ce 100644 --- a/drivers/net/wireless/bcmdhd/include/proto/bcmevent.h +++ b/drivers/net/wireless/bcmdhd/include/proto/bcmevent.h @@ -1,7 +1,7 @@ /* * Broadcom Event protocol definitions * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -23,7 +23,7 @@ * * Dependencies: proto/bcmeth.h * - * $Id: bcmevent.h 369617 2012-11-19 16:45:34Z $ + * $Id: bcmevent.h 429124 2013-10-11 09:47:05Z $ * */ @@ -36,6 +36,8 @@ #include #endif +#include + #include @@ -141,7 +143,7 @@ typedef BWL_PRE_PACKED_STRUCT struct bcm_event { #define WLC_E_EXCEEDED_MEDIUM_TIME 48 #define WLC_E_ICV_ERROR 49 #define WLC_E_UNICAST_DECODE_ERROR 50 -#define WLC_E_MULTICAST_DECODE_ERROR 51 +#define WLC_E_MULTICAST_DECODE_ERROR 51 #define WLC_E_TRACE 52 #ifdef WLBTAMP #define WLC_E_BTA_HCI_EVENT 53 @@ -150,6 +152,8 @@ typedef BWL_PRE_PACKED_STRUCT struct bcm_event { #define WLC_E_P2P_DISC_LISTEN_COMPLETE 55 #define WLC_E_RSSI 56 #define WLC_E_PFN_SCAN_COMPLETE 57 + +#define WLC_E_PFN_BEST_BATCHING 57 #define WLC_E_EXTLOG_MSG 58 #define WLC_E_ACTION_FRAME 59 #define WLC_E_ACTION_FRAME_COMPLETE 60 @@ -166,9 +170,7 @@ typedef BWL_PRE_PACKED_STRUCT struct bcm_event { #define WLC_E_PROBRESP_MSG 71 #define WLC_E_P2P_PROBREQ_MSG 72 #define WLC_E_DCS_REQUEST 73 - #define WLC_E_FIFO_CREDIT_MAP 74 - #define WLC_E_ACTION_FRAME_RX 75 #define WLC_E_WAKE_EVENT 76 #define WLC_E_RM_COMPLETE 77 @@ -177,34 +179,58 @@ typedef BWL_PRE_PACKED_STRUCT struct bcm_event { #define WLC_E_CSA_COMPLETE_IND 80 #define WLC_E_EXCESS_PM_WAKE_EVENT 81 #define WLC_E_PFN_SCAN_NONE 82 + +#define WLC_E_PFN_BSSID_NET_FOUND 82 #define WLC_E_PFN_SCAN_ALLGONE 83 -#define WLC_E_GTK_PLUMBED 84 + +#define WLC_E_PFN_BSSID_NET_LOST 83 +#define WLC_E_GTK_PLUMBED 84 #define WLC_E_ASSOC_IND_NDIS 85 #define WLC_E_REASSOC_IND_NDIS 86 -#define WLC_E_ASSOC_REQ_IE 87 -#define WLC_E_ASSOC_RESP_IE 88 -#define WLC_E_ASSOC_RECREATED 89 +#define WLC_E_ASSOC_REQ_IE 87 +#define WLC_E_ASSOC_RESP_IE 88 +#define WLC_E_ASSOC_RECREATED 89 #define WLC_E_ACTION_FRAME_RX_NDIS 90 -#define WLC_E_AUTH_REQ 91 -#define WLC_E_TDLS_PEER_EVENT 92 +#define WLC_E_AUTH_REQ 91 +#define WLC_E_TDLS_PEER_EVENT 92 #define WLC_E_SPEEDY_RECREATE_FAIL 93 -#define WLC_E_NATIVE 94 -#define WLC_E_PKTDELAY_IND 95 -#define WLC_E_AWDL_AW 96 -#define WLC_E_AWDL_ROLE 97 -#define WLC_E_AWDL_EVENT 98 +#define WLC_E_NATIVE 94 +#define WLC_E_PKTDELAY_IND 95 +#define WLC_E_AWDL_AW 96 +#define WLC_E_AWDL_ROLE 97 +#define WLC_E_AWDL_EVENT 98 #ifdef WLNIC -#define WLC_E_NIC_AF_TXS 99 -#define WLC_E_NIC_NIC_REPORT 100 +#define WLC_E_NIC_AF_TXS 99 +#define WLC_E_NIC_NIC_REPORT 100 #endif #define WLC_E_BEACON_FRAME_RX 101 -#define WLC_E_SERVICE_FOUND 102 -#define WLC_E_GAS_FRAGMENT_RX 103 -#define WLC_E_GAS_COMPLETE 104 -#define WLC_E_P2PO_ADD_DEVICE 105 -#define WLC_E_P2PO_DEL_DEVICE 106 -#define WLC_E_IBSS_COALESCE 107 -#define WLC_E_LAST 108 +#define WLC_E_SERVICE_FOUND 102 +#define WLC_E_GAS_FRAGMENT_RX 103 +#define WLC_E_GAS_COMPLETE 104 +#define WLC_E_P2PO_ADD_DEVICE 105 +#define WLC_E_P2PO_DEL_DEVICE 106 +#define WLC_E_WNM_STA_SLEEP 107 +#define WLC_E_NONE 108 +#define WLC_E_PROXD 109 +#define WLC_E_IBSS_COALESCE 110 +#define WLC_E_AIBSS_TXFAIL 110 +#define WLC_E_AWDL_AW_EXT_END 111 +#define WLC_E_AWDL_AW_EXT_START 112 +#define WLC_E_AWDL_AW_START 113 +#define WLC_E_AWDL_RADIO_OFF 114 +#define WLC_E_AWDL_PEER_STATE 115 +#define WLC_E_AWDL_SYNC_STATE_CHANGED 116 +#define WLC_E_AWDL_CHIP_RESET 117 +#define WLC_E_AWDL_INTERLEAVED_SCAN_START 118 +#define WLC_E_AWDL_INTERLEAVED_SCAN_STOP 119 +#define WLC_E_AWDL_PEER_CACHE_CONTROL 120 +#define WLC_E_CSA_START_IND 121 +#define WLC_E_CSA_DONE_IND 122 +#define WLC_E_CSA_FAILURE_IND 123 +#define WLC_E_CCA_CHAN_QUAL 124 +#define WLC_E_CCX_S69_RESP_RX 129 +#define WLC_E_LAST 130 + typedef struct { @@ -231,8 +257,8 @@ extern const int bcmevent_names_size; #define WLC_E_STATUS_SUPPRESS 12 #define WLC_E_STATUS_NOCHANS 13 #ifdef BCMCCX -#define WLC_E_STATUS_CCXFASTRM 14 -#endif +#define WLC_E_STATUS_CCXFASTRM 14 +#endif #define WLC_E_STATUS_CS_ABORT 15 #define WLC_E_STATUS_ERROR 16 @@ -242,19 +268,19 @@ extern const int bcmevent_names_size; #define WLC_E_REASON_DEAUTH 2 #define WLC_E_REASON_DISASSOC 3 #define WLC_E_REASON_BCNS_LOST 4 -#define WLC_E_REASON_MINTXRATE 9 -#define WLC_E_REASON_TXFAIL 10 #define WLC_E_REASON_FAST_ROAM_FAILED 5 #define WLC_E_REASON_DIRECTED_ROAM 6 #define WLC_E_REASON_TSPEC_REJECTED 7 #define WLC_E_REASON_BETTER_AP 8 - +#define WLC_E_REASON_MINTXRATE 9 +#define WLC_E_REASON_TXFAIL 10 #define WLC_E_REASON_REQUESTED_ROAM 11 + #define WLC_E_PRUNE_ENCR_MISMATCH 1 #define WLC_E_PRUNE_BCAST_BSSID 2 #define WLC_E_PRUNE_MAC_DENY 3 @@ -266,20 +292,20 @@ extern const int bcmevent_names_size; #define WLC_E_PRUNE_NO_COMMON_RATES 9 #define WLC_E_PRUNE_BASIC_RATES 10 #ifdef BCMCCX -#define WLC_E_PRUNE_CCXFAST_PREVAP 11 -#endif +#define WLC_E_PRUNE_CCXFAST_PREVAP 11 +#endif #define WLC_E_PRUNE_CIPHER_NA 12 #define WLC_E_PRUNE_KNOWN_STA 13 #ifdef BCMCCX -#define WLC_E_PRUNE_CCXFAST_DROAM 14 -#endif +#define WLC_E_PRUNE_CCXFAST_DROAM 14 +#endif #define WLC_E_PRUNE_WDS_PEER 15 #define WLC_E_PRUNE_QBSS_LOAD 16 #define WLC_E_PRUNE_HOME_AP 17 #ifdef BCMCCX -#define WLC_E_PRUNE_AP_BLOCKED 18 -#define WLC_E_PRUNE_NO_DIAG_SUPPORT 19 -#endif +#define WLC_E_PRUNE_AP_BLOCKED 18 +#define WLC_E_PRUNE_NO_DIAG_SUPPORT 19 +#endif #define WLC_E_SUP_OTHER 0 @@ -301,6 +327,14 @@ extern const int bcmevent_names_size; +#ifdef WLAWDL +#define WLC_E_AWDL_SCAN_START 1 +#define WLC_E_AWDL_SCAN_DONE 0 + +#define WLC_E_AWDL_RX_ACT_FRAME 1 +#define WLC_E_AWDL_RX_PRB_RESP 2 + +#endif typedef BWL_PRE_PACKED_STRUCT struct wl_event_rx_frame_data { uint16 version; uint16 channel; @@ -315,7 +349,7 @@ typedef BWL_PRE_PACKED_STRUCT struct wl_event_rx_frame_data { typedef struct wl_event_data_if { uint8 ifidx; uint8 opcode; - uint8 reserved; + uint8 reserved; uint8 bssidx; uint8 role; } wl_event_data_if_t; @@ -336,7 +370,16 @@ typedef struct wl_event_data_if { #define WLC_E_IF_ROLE_BTA_ACCEPTOR 6 #endif -#define WLC_E_IF_FLAGS_BSSCFG_NOIF 0x1 + +typedef struct wl_event_data_rssi { + int32 rssi; + int32 snr; + int32 noise; +} wl_event_data_rssi_t; + + +#define WLC_E_IF_FLAGS_BSSCFG_NOIF 0x1 + #define WLC_E_LINK_BCN_LOSS 1 #define WLC_E_LINK_DISASSOC 2 @@ -352,28 +395,67 @@ typedef struct wl_event_data_if { #define WLC_E_TDLS_PEER_CONNECTED 1 #define WLC_E_TDLS_PEER_DISCONNECTED 2 +#ifdef WLAWDL + +#define WLC_E_AWDL_SCAN_STATUS 0 +#define WLC_E_AWDL_RX_ACT_FRAME 1 +#define WLC_E_AWDL_RX_PRB_RESP 2 +#define WLC_E_AWDL_PHYCAL_STATUS 3 +#define WLC_E_AWDL_WOWL_NULLPKT 4 +#define WLC_E_AWDL_OOB_AF_STATUS 5 + + +#define WLC_E_AWDL_SCAN_START 1 +#define WLC_E_AWDL_SCAN_DONE 0 +#define WLC_E_AWDL_PHYCAL_START 1 +#define WLC_E_AWDL_PHYCAL_DONE 0 +#endif + typedef BWL_PRE_PACKED_STRUCT struct wl_event_gas { - uint16 channel; - uint8 dialog_token; - uint8 fragment_id; - uint16 status_code; - uint16 data_len; - uint8 data[1]; + uint16 channel; + uint8 dialog_token; + uint8 fragment_id; + uint16 status_code; + uint16 data_len; + uint8 data[1]; } BWL_POST_PACKED_STRUCT wl_event_gas_t; +typedef BWL_PRE_PACKED_STRUCT struct wl_sd_tlv { + uint16 length; + uint8 protocol; + uint8 transaction_id; + uint8 status_code; + uint8 data[1]; +} BWL_POST_PACKED_STRUCT wl_sd_tlv_t; + + typedef BWL_PRE_PACKED_STRUCT struct wl_event_sd { - uint8 protocol; - uint16 channel; - uint8 dialog_token; - uint8 fragment_id; - uint16 status_code; - uint16 data_len; - uint8 data[1]; + uint16 channel; + uint8 count; + wl_sd_tlv_t tlv[1]; } BWL_POST_PACKED_STRUCT wl_event_sd_t; +#define WLC_E_PROXD_FOUND 1 +#define WLC_E_PROXD_GONE 2 + + +typedef BWL_PRE_PACKED_STRUCT struct awdl_aws_event_data { + uint32 fw_time; + struct ether_addr current_master; + uint16 aw_counter; + uint8 aw_ext_count; + uint8 aw_role; + uint8 flags; + uint16 aw_chan; +} BWL_POST_PACKED_STRUCT awdl_aws_event_data_t; + + +#define AWDL_AW_LAST_EXT 0x01 + + #include #endif diff --git a/drivers/net/wireless/bcmdhd/include/proto/bcmip.h b/drivers/net/wireless/bcmdhd/include/proto/bcmip.h index e24074635c0..e89bed9951d 100644 --- a/drivers/net/wireless/bcmdhd/include/proto/bcmip.h +++ b/drivers/net/wireless/bcmdhd/include/proto/bcmip.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -21,7 +21,7 @@ * * Fundamental constants relating to IP Protocol * - * $Id: bcmip.h 346935 2012-07-25 00:24:55Z $ + * $Id: bcmip.h 384540 2013-02-12 04:28:58Z $ */ #ifndef _bcmip_h_ @@ -52,16 +52,16 @@ #define IP_PROT_ICMP6 0x3a -#define IPV4_VER_HL_OFFSET 0 -#define IPV4_TOS_OFFSET 1 -#define IPV4_PKTLEN_OFFSET 2 -#define IPV4_PKTFLAG_OFFSET 6 -#define IPV4_PROT_OFFSET 9 -#define IPV4_CHKSUM_OFFSET 10 -#define IPV4_SRC_IP_OFFSET 12 -#define IPV4_DEST_IP_OFFSET 16 -#define IPV4_OPTIONS_OFFSET 20 -#define IPV4_MIN_HEADER_LEN 20 +#define IPV4_VER_HL_OFFSET 0 +#define IPV4_TOS_OFFSET 1 +#define IPV4_PKTLEN_OFFSET 2 +#define IPV4_PKTFLAG_OFFSET 6 +#define IPV4_PROT_OFFSET 9 +#define IPV4_CHKSUM_OFFSET 10 +#define IPV4_SRC_IP_OFFSET 12 +#define IPV4_DEST_IP_OFFSET 16 +#define IPV4_OPTIONS_OFFSET 20 +#define IPV4_MIN_HEADER_LEN 20 #define IPV4_VER_MASK 0xf0 diff --git a/drivers/net/wireless/bcmdhd/include/proto/bcmipv6.h b/drivers/net/wireless/bcmdhd/include/proto/bcmipv6.h index 95333918274..e5f10d11559 100644 --- a/drivers/net/wireless/bcmdhd/include/proto/bcmipv6.h +++ b/drivers/net/wireless/bcmdhd/include/proto/bcmipv6.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -21,7 +21,7 @@ * * Fundamental constants relating to Neighbor Discovery Protocol * - * $Id: bcmipv6.h 309193 2012-01-19 00:03:57Z $ + * $Id: bcmipv6.h 384540 2013-02-12 04:28:58Z $ */ #ifndef _bcmipv6_h_ @@ -34,6 +34,28 @@ /* This marks the start of a packed structure section. */ #include +/* Extension headers */ +#define IPV6_EXT_HOP 0 +#define IPV6_EXT_ROUTE 43 +#define IPV6_EXT_FRAG 44 +#define IPV6_EXT_DEST 60 +#define IPV6_EXT_ESEC 50 +#define IPV6_EXT_AUTH 51 + +/* Minimum size (extension header "word" length) */ +#define IPV6_EXT_WORD 8 + +/* Offsets for most extension headers */ +#define IPV6_EXT_NEXTHDR 0 +#define IPV6_EXT_HDRLEN 1 + +/* Constants specific to fragmentation header */ +#define IPV6_FRAG_MORE_MASK 0x0001 +#define IPV6_FRAG_MORE_SHIFT 0 +#define IPV6_FRAG_OFFS_MASK 0xfff8 +#define IPV6_FRAG_OFFS_SHIFT 3 + +/* For icmpv6 */ #define ICMPV6_HEADER_TYPE 0x3A #define ICMPV6_PKT_TYPE_NS 135 #define ICMPV6_PKT_TYPE_NA 136 @@ -41,6 +63,10 @@ #define ICMPV6_ND_OPT_TYPE_TARGET_MAC 2 #define ICMPV6_ND_OPT_TYPE_SRC_MAC 1 +#define ICMPV6_ND_OPT_LEN_LINKADDR 1 + +#define ICMPV6_ND_OPT_LEN_LINKADDR 1 + #define IPV6_VERSION 6 #define IPV6_HOP_LIMIT 255 @@ -49,6 +75,8 @@ a[10] | a[11] | a[12] | a[13] | \ a[14] | a[15]) == 0) +#define IPV6_ADDR_LOCAL(a) (((a[0] == 0xfe) && (a[1] & 0x80))? TRUE: FALSE) + /* IPV6 address */ BWL_PRE_PACKED_STRUCT struct ipv6_addr { uint8 addr[16]; @@ -98,7 +126,22 @@ BWL_PRE_PACKED_STRUCT struct nd_msg_opt { uint8 mac_addr[ETHER_ADDR_LEN]; } BWL_POST_PACKED_STRUCT; +/* Ipv6 Fragmentation Header */ +BWL_PRE_PACKED_STRUCT struct ipv6_frag { + uint8 nexthdr; + uint8 reserved; + uint16 frag_offset; + uint32 ident; +} BWL_POST_PACKED_STRUCT; + /* This marks the end of a packed structure section. */ #include +static const struct ipv6_addr all_node_ipv6_maddr = { + { 0xff, 0x2, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 1 + }}; + #endif /* !defined(_bcmipv6_h_) */ diff --git a/drivers/net/wireless/bcmdhd/include/proto/bt_amp_hci.h b/drivers/net/wireless/bcmdhd/include/proto/bt_amp_hci.h index 8617985dd36..d56b10b7cdc 100644 --- a/drivers/net/wireless/bcmdhd/include/proto/bt_amp_hci.h +++ b/drivers/net/wireless/bcmdhd/include/proto/bt_amp_hci.h @@ -1,7 +1,7 @@ /* * BT-AMP (BlueTooth Alternate Mac and Phy) HCI (Host/Controller Interface) * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -21,7 +21,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: bt_amp_hci.h 294267 2011-11-04 23:41:52Z $ + * $Id: bt_amp_hci.h 382882 2013-02-04 23:24:31Z $ */ #ifndef _bt_amp_hci_h diff --git a/drivers/net/wireless/bcmdhd/include/proto/eapol.h b/drivers/net/wireless/bcmdhd/include/proto/eapol.h index 8936d1641a3..b59b84f8517 100644 --- a/drivers/net/wireless/bcmdhd/include/proto/eapol.h +++ b/drivers/net/wireless/bcmdhd/include/proto/eapol.h @@ -7,7 +7,7 @@ * * Copyright (C) 2002 Broadcom Corporation * - * $Id: eapol.h 241182 2011-02-17 21:50:03Z $ + * $Id: eapol.h 382882 2013-02-04 23:24:31Z $ */ #ifndef _eapol_h_ diff --git a/drivers/net/wireless/bcmdhd/include/proto/ethernet.h b/drivers/net/wireless/bcmdhd/include/proto/ethernet.h index 7debff4293a..a85fd656f6c 100644 --- a/drivers/net/wireless/bcmdhd/include/proto/ethernet.h +++ b/drivers/net/wireless/bcmdhd/include/proto/ethernet.h @@ -1,7 +1,7 @@ /* * From FreeBSD 2.2.7: Fundamental constants relating to ethernet. * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -21,10 +21,10 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: ethernet.h 354714 2012-09-03 03:12:21Z $ + * $Id: ethernet.h 384540 2013-02-12 04:28:58Z $ */ -#ifndef _NET_ETHERNET_H_ +#ifndef _NET_ETHERNET_H_ #define _NET_ETHERNET_H_ #ifndef _TYPEDEFS_H_ @@ -68,15 +68,15 @@ #define ETHER_TYPE_BRCM 0x886c #define ETHER_TYPE_802_1X 0x888e #ifdef PLC -#define ETHER_TYPE_88E1 0x88e1 -#define ETHER_TYPE_8912 0x8912 -#define ETHER_TYPE_GIGLED 0xffff -#endif +#define ETHER_TYPE_88E1 0x88e1 +#define ETHER_TYPE_8912 0x8912 +#define ETHER_TYPE_GIGLED 0xffff +#endif #define ETHER_TYPE_802_1X_PREAUTH 0x88c7 #define ETHER_TYPE_WAI 0x88b4 #define ETHER_TYPE_89_0D 0x890d -#define ETHER_TYPE_IPV6 0x86dd +#define ETHER_TYPE_PPP_SES 0x8864 #define ETHER_BRCM_SUBTYPE_LEN 4 @@ -99,7 +99,7 @@ ((uint8 *)ea)[5] = ((mgrp_ip) >> 0) & 0xff; \ } -#ifndef __INCif_etherh +#ifndef __INCif_etherh BWL_PRE_PACKED_STRUCT struct ether_header { uint8 ether_dhost[ETHER_ADDR_LEN]; @@ -127,9 +127,9 @@ BWL_PRE_PACKED_STRUCT struct ether_addr { -#define eacmp(a, b) ((((uint16 *)(a))[0] ^ ((uint16 *)(b))[0]) | \ - (((uint16 *)(a))[1] ^ ((uint16 *)(b))[1]) | \ - (((uint16 *)(a))[2] ^ ((uint16 *)(b))[2])) +#define eacmp(a, b) ((((const uint16 *)(a))[0] ^ ((const uint16 *)(b))[0]) | \ + (((const uint16 *)(a))[1] ^ ((const uint16 *)(b))[1]) | \ + (((const uint16 *)(a))[2] ^ ((const uint16 *)(b))[2])) #define ether_cmp(a, b) eacmp(a, b) @@ -144,22 +144,31 @@ do { \ #define ether_copy(s, d) eacopy(s, d) +#define ether_rcopy(s, d) \ +do { \ + ((uint16 *)(d))[2] = ((uint16 *)(s))[2]; \ + ((uint16 *)(d))[1] = ((uint16 *)(s))[1]; \ + ((uint16 *)(d))[0] = ((uint16 *)(s))[0]; \ +} while (0) + + + static const struct ether_addr ether_bcast = {{255, 255, 255, 255, 255, 255}}; static const struct ether_addr ether_null = {{0, 0, 0, 0, 0, 0}}; static const struct ether_addr ether_ipv6_mcast = {{0x33, 0x33, 0x00, 0x00, 0x00, 0x01}}; -#define ETHER_ISBCAST(ea) ((((uint8 *)(ea))[0] & \ - ((uint8 *)(ea))[1] & \ - ((uint8 *)(ea))[2] & \ - ((uint8 *)(ea))[3] & \ - ((uint8 *)(ea))[4] & \ - ((uint8 *)(ea))[5]) == 0xff) -#define ETHER_ISNULLADDR(ea) ((((uint8 *)(ea))[0] | \ - ((uint8 *)(ea))[1] | \ - ((uint8 *)(ea))[2] | \ - ((uint8 *)(ea))[3] | \ - ((uint8 *)(ea))[4] | \ - ((uint8 *)(ea))[5]) == 0) +#define ETHER_ISBCAST(ea) ((((const uint8 *)(ea))[0] & \ + ((const uint8 *)(ea))[1] & \ + ((const uint8 *)(ea))[2] & \ + ((const uint8 *)(ea))[3] & \ + ((const uint8 *)(ea))[4] & \ + ((const uint8 *)(ea))[5]) == 0xff) +#define ETHER_ISNULLADDR(ea) ((((const uint8 *)(ea))[0] | \ + ((const uint8 *)(ea))[1] | \ + ((const uint8 *)(ea))[2] | \ + ((const uint8 *)(ea))[3] | \ + ((const uint8 *)(ea))[4] | \ + ((const uint8 *)(ea))[5]) == 0) #define ETHER_ISNULLDEST(da) ((((const uint16 *)(da))[0] | \ ((const uint16 *)(da))[1] | \ diff --git a/drivers/net/wireless/bcmdhd/include/proto/p2p.h b/drivers/net/wireless/bcmdhd/include/proto/p2p.h index 8134610dd5f..adb3f30dfee 100644 --- a/drivers/net/wireless/bcmdhd/include/proto/p2p.h +++ b/drivers/net/wireless/bcmdhd/include/proto/p2p.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -21,7 +21,7 @@ * * Fundamental types and constants relating to WFA P2P (aka WiFi Direct) * - * $Id: p2p.h 356416 2012-09-12 16:40:42Z $ + * $Id: p2p.h 384536 2013-02-12 04:13:09Z $ */ #ifndef _P2P_H_ @@ -376,7 +376,7 @@ typedef struct wifi_p2p_pub_act_frame wifi_p2p_pub_act_frame_t; #define P2P_PAF_DEVDIS_RSP 6 #define P2P_PAF_PROVDIS_REQ 7 #define P2P_PAF_PROVDIS_RSP 8 -#define P2P_PAF_SUBTYPE_INVALID 255 +#define P2P_PAF_SUBTYPE_INVALID 255 #define P2P_TYPE_MNREQ P2P_PAF_GON_REQ @@ -403,6 +403,8 @@ typedef struct wifi_p2p_noa_se wifi_p2p_noa_se_t; #define P2P_NOA_SE_FIXED_LEN 5 +#define P2P_NOA_SE_MAX_DESC 2 + #define P2P_NOA_DESC_CNT_RESERVED 0 #define P2P_NOA_DESC_CNT_REPEAT 255 diff --git a/drivers/net/wireless/bcmdhd/include/proto/sdspi.h b/drivers/net/wireless/bcmdhd/include/proto/sdspi.h index a4900edd4ac..6263f40a8ae 100644 --- a/drivers/net/wireless/bcmdhd/include/proto/sdspi.h +++ b/drivers/net/wireless/bcmdhd/include/proto/sdspi.h @@ -1,7 +1,7 @@ /* * SD-SPI Protocol Standard * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -21,7 +21,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: sdspi.h 241182 2011-02-17 21:50:03Z $ + * $Id: sdspi.h 382882 2013-02-04 23:24:31Z $ */ #ifndef _SD_SPI_H #define _SD_SPI_H diff --git a/drivers/net/wireless/bcmdhd/include/proto/vlan.h b/drivers/net/wireless/bcmdhd/include/proto/vlan.h index a3cb25b1f17..8de18698929 100644 --- a/drivers/net/wireless/bcmdhd/include/proto/vlan.h +++ b/drivers/net/wireless/bcmdhd/include/proto/vlan.h @@ -1,7 +1,7 @@ /* * 802.1Q VLAN protocol definitions * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -21,7 +21,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: vlan.h 346935 2012-07-25 00:24:55Z $ + * $Id: vlan.h 382883 2013-02-04 23:26:09Z $ */ #ifndef _vlan_h_ @@ -34,14 +34,17 @@ #include +#ifndef VLAN_VID_MASK #define VLAN_VID_MASK 0xfff +#endif + #define VLAN_CFI_SHIFT 12 #define VLAN_PRI_SHIFT 13 #define VLAN_PRI_MASK 7 -#define VLAN_TPID_OFFSET 12 -#define VLAN_TCI_OFFSET 14 +#define VLAN_TPID_OFFSET 12 +#define VLAN_TCI_OFFSET 14 #define VLAN_TAG_LEN 4 #define VLAN_TAG_OFFSET (2 * ETHER_ADDR_LEN) @@ -49,8 +52,8 @@ #define VLAN_TPID 0x8100 struct vlan_header { - uint16 vlan_type; - uint16 vlan_tag; + uint16 vlan_type; + uint16 vlan_tag; }; struct ethervlan_header { @@ -61,6 +64,19 @@ struct ethervlan_header { uint16 ether_type; }; +struct dot3_mac_llc_snapvlan_header { + uint8 ether_dhost[ETHER_ADDR_LEN]; + uint8 ether_shost[ETHER_ADDR_LEN]; + uint16 length; + uint8 dsap; + uint8 ssap; + uint8 ctl; + uint8 oui[3]; + uint16 vlan_type; + uint16 vlan_tag; + uint16 ether_type; +}; + #define ETHERVLAN_HDR_LEN (ETHER_HDR_LEN + VLAN_TAG_LEN) diff --git a/drivers/net/wireless/bcmdhd/include/proto/wpa.h b/drivers/net/wireless/bcmdhd/include/proto/wpa.h index 9c73b545ece..3ceae2b5f6d 100644 --- a/drivers/net/wireless/bcmdhd/include/proto/wpa.h +++ b/drivers/net/wireless/bcmdhd/include/proto/wpa.h @@ -1,7 +1,7 @@ /* * Fundamental types and constants relating to WPA * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -21,7 +21,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: wpa.h 369547 2012-11-19 08:57:31Z $ + * $Id: wpa.h 384536 2013-02-12 04:13:09Z $ */ #ifndef _proto_wpa_h_ @@ -34,9 +34,7 @@ #include -#ifdef CUSTOMER_HW4 -#include -#endif + #define DOT11_RC_INVALID_WPA_IE 13 @@ -118,9 +116,9 @@ typedef BWL_PRE_PACKED_STRUCT struct #define WPA_CIPHER_BIP 6 #define WPA_CIPHER_TPK 7 #ifdef BCMCCX -#define WPA_CIPHER_CKIP 8 -#define WPA_CIPHER_CKIP_MMH 9 -#define WPA_CIPHER_WEP_MMH 10 +#define WPA_CIPHER_CKIP 8 +#define WPA_CIPHER_CKIP_MMH 9 +#define WPA_CIPHER_WEP_MMH 10 #define IS_CCX_CIPHER(cipher) ((cipher) == WPA_CIPHER_CKIP || \ (cipher) == WPA_CIPHER_CKIP_MMH || \ @@ -174,6 +172,8 @@ typedef BWL_PRE_PACKED_STRUCT struct #define RSN_CAP_16_REPLAY_CNTRS 3 #define RSN_CAP_MFPR 0x0040 #define RSN_CAP_MFPC 0x0080 +#define RSN_CAP_SPPC 0x0400 +#define RSN_CAP_SPPR 0x0800 #define WPA_CAP_4_REPLAY_CNTRS RSN_CAP_4_REPLAY_CNTRS diff --git a/drivers/net/wireless/bcmdhd/include/proto/wps.h b/drivers/net/wireless/bcmdhd/include/proto/wps.h index cccbfff4cfb..184220d40e8 100644 --- a/drivers/net/wireless/bcmdhd/include/proto/wps.h +++ b/drivers/net/wireless/bcmdhd/include/proto/wps.h @@ -1,7 +1,7 @@ /* * WPS IE definitions * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd/include/sbchipc.h b/drivers/net/wireless/bcmdhd/include/sbchipc.h index e949ad660dc..cfdfbd12fa7 100644 --- a/drivers/net/wireless/bcmdhd/include/sbchipc.h +++ b/drivers/net/wireless/bcmdhd/include/sbchipc.h @@ -5,9 +5,9 @@ * JTAG, 0/1/2 UARTs, clock frequency control, a watchdog interrupt timer, * GPIO interface, extbus, and support for serial and parallel flashes. * - * $Id: sbchipc.h 368270 2012-11-12 23:46:50Z $ + * $Id: sbchipc.h 385540 2013-02-15 23:14:50Z $ * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -289,10 +289,10 @@ typedef volatile struct { uint32 pllcontrol_data; uint32 pmustrapopt; uint32 pmu_xtalfreq; - uint32 retention_ctl; + uint32 retention_ctl; uint32 PAD[3]; - uint32 retention_grpidx; - uint32 retention_grpctl; + uint32 retention_grpidx; + uint32 retention_grpctl; uint32 PAD[94]; uint16 sromotp[512]; #ifdef NFLASH_SUPPORT @@ -358,58 +358,58 @@ typedef volatile struct { uint32 nand_cache_data; uint32 nand_ctrl_config; uint32 nand_ctrl_status; -#endif - uint32 gci_corecaps0; +#endif + uint32 gci_corecaps0; uint32 gci_corecaps1; uint32 gci_corecaps2; uint32 gci_corectrl; - uint32 gci_corestat; - uint32 gci_intstat; - uint32 gci_intmask; - uint32 gci_wakemask; - uint32 gci_levelintstat; - uint32 gci_eventintstat; + uint32 gci_corestat; + uint32 gci_intstat; + uint32 gci_intmask; + uint32 gci_wakemask; + uint32 gci_levelintstat; + uint32 gci_eventintstat; uint32 PAD[6]; - uint32 gci_indirect_addr; - uint32 gci_gpioctl; + uint32 gci_indirect_addr; + uint32 gci_gpioctl; uint32 PAD; - uint32 gci_gpiomask; + uint32 gci_gpiomask; uint32 PAD; - uint32 gci_miscctl; + uint32 gci_miscctl; uint32 PAD[2]; - uint32 gci_input[32]; - uint32 gci_event[32]; - uint32 gci_output[4]; - uint32 gci_control_0; - uint32 gci_control_1; - uint32 gci_level_polreg; - uint32 gci_levelintmask; - uint32 gci_eventintmask; + uint32 gci_input[32]; + uint32 gci_event[32]; + uint32 gci_output[4]; + uint32 gci_control_0; + uint32 gci_control_1; + uint32 gci_level_polreg; + uint32 gci_levelintmask; + uint32 gci_eventintmask; uint32 PAD[3]; - uint32 gci_inbandlevelintmask; - uint32 gci_inbandeventintmask; + uint32 gci_inbandlevelintmask; + uint32 gci_inbandeventintmask; uint32 PAD[2]; - uint32 gci_seciauxtx; - uint32 gci_seciauxrx; - uint32 gci_secitx_datatag; - uint32 gci_secirx_datatag; - uint32 gci_secitx_datamask; - uint32 gci_seciusef0tx_reg; - uint32 gci_secif0tx_offset; - uint32 gci_secif0rx_offset; - uint32 gci_secif1tx_offset; + uint32 gci_seciauxtx; + uint32 gci_seciauxrx; + uint32 gci_secitx_datatag; + uint32 gci_secirx_datatag; + uint32 gci_secitx_datamask; + uint32 gci_seciusef0tx_reg; + uint32 gci_secif0tx_offset; + uint32 gci_secif0rx_offset; + uint32 gci_secif1tx_offset; uint32 PAD[3]; - uint32 gci_uartescval; + uint32 gci_uartescval; uint32 PAD[3]; - uint32 gci_secibauddiv; - uint32 gci_secifcr; - uint32 gci_secilcr; - uint32 gci_secimcr; + uint32 gci_secibauddiv; + uint32 gci_secifcr; + uint32 gci_secilcr; + uint32 gci_secimcr; uint32 PAD[2]; - uint32 gci_baudadj; + uint32 gci_baudadj; uint32 PAD; - uint32 gci_chipctrl; - uint32 gci_chipsts; + uint32 gci_chipctrl; + uint32 gci_chipsts; } chipcregs_t; #endif @@ -515,11 +515,11 @@ typedef volatile struct { #define CC_CAP2_GSIO 0x00000002 -#define CC_CAP_EXT_SECI_PRESENT 0x00000001 -#define CC_CAP_EXT_GCI_PRESENT 0x00000004 +#define CC_CAP_EXT_SECI_PRESENT 0x00000001 +#define CC_CAP_EXT_GCI_PRESENT 0x00000004 -#define GCI_WL_CHN_INFO_MASK (0xFF00) +#define GCI_WL_CHN_INFO_MASK (0xFF00) #define PLL_NONE 0x00000000 #define PLL_TYPE1 0x00010000 @@ -556,7 +556,7 @@ typedef volatile struct { #define NS_FAST_MEM_CLOCK 800000000 #define NS_MEM_CLOCK 533000000 #define NS_SLOW_MEM_CLOCK 400000000 -#endif +#endif #define HT_CLOCK 80000000 @@ -1161,6 +1161,7 @@ typedef volatile struct { #define PMU_CHIPCTL0 0 +#define PMU43143_CC0_SDIO_DRSTR_OVR (1 << 31) #define PMU_CC1_CLKREQ_TYPE_SHIFT 19 @@ -1195,6 +1196,9 @@ typedef volatile struct { #define PMU_CC3_RF_DISABLE_IVALUE_SHIFT 23 +#define PMU_CHIPCTL5 5 + + @@ -1580,6 +1584,10 @@ typedef volatile struct { #define CCTRL43217_EXTPA_C1 (1<<8) +#define CCTRL43228_EXTPA_C0 (1<<14) +#define CCTRL43228_EXTPA_C1 (1<<9) + + #define RES4328_EXT_SWITCHER_PWM 0 #define RES4328_BB_SWITCHER_PWM 1 #define RES4328_BB_SWITCHER_BURST 2 @@ -2125,7 +2133,7 @@ typedef volatile struct { #define PMU_VREG4_LPLDO2_1p15V 1 #define PMU_VREG4_LPLDO2_1p20V 2 #define PMU_VREG4_LPLDO2_1p10V 3 -#define PMU_VREG4_LPLDO2_0p90V 4 +#define PMU_VREG4_LPLDO2_0p90V 4 #define PMU_VREG4_HSICLDO_BYPASS_SHIFT 27 #define PMU_VREG4_HSICLDO_BYPASS_MASK 0x1 @@ -2208,11 +2216,11 @@ typedef volatile struct { #define CCTRL43341_BT_ISO_SEL (1 << 16) -#define CCTRL1_4334_GPIO_SEL (1 << 0) -#define CCTRL1_4334_ERCX_SEL (1 << 1) -#define CCTRL1_4334_SDIO_HOST_WAKE (1 << 2) -#define CCTRL1_4334_JTAG_DISABLE (1 << 3) -#define CCTRL1_4334_UART_ON_4_5 (1 << 28) +#define CCTRL1_4334_GPIO_SEL (1 << 0) +#define CCTRL1_4334_ERCX_SEL (1 << 1) +#define CCTRL1_4334_SDIO_HOST_WAKE (1 << 2) +#define CCTRL1_4334_JTAG_DISABLE (1 << 3) +#define CCTRL1_4334_UART_ON_4_5 (1 << 28) #define CCTRL1_4324_GPIO_SEL (1 << 0) @@ -2220,47 +2228,47 @@ typedef volatile struct { -#define CST43143_REMAP_TO_ROM (3 << 0) -#define CST43143_SDIO_EN (1 << 2) -#define CST43143_SDIO_ISO (1 << 3) -#define CST43143_USB_CPU_LESS (1 << 4) -#define CST43143_CBUCK_MODE (3 << 6) -#define CST43143_POK_CBUCK (1 << 8) +#define CST43143_REMAP_TO_ROM (3 << 0) +#define CST43143_SDIO_EN (1 << 2) +#define CST43143_SDIO_ISO (1 << 3) +#define CST43143_USB_CPU_LESS (1 << 4) +#define CST43143_CBUCK_MODE (3 << 6) +#define CST43143_POK_CBUCK (1 << 8) #define CST43143_PMU_OVRSPIKE (1 << 9) #define CST43143_PMU_OVRTEMP (0xF << 10) #define CST43143_SR_FLL_CAL_DONE (1 << 14) #define CST43143_USB_PLL_LOCKDET (1 << 15) #define CST43143_PMU_PLL_LOCKDET (1 << 16) -#define CST43143_CHIPMODE_SDIOD(cs) (((cs) & CST43143_SDIO_EN) != 0) +#define CST43143_CHIPMODE_SDIOD(cs) (((cs) & CST43143_SDIO_EN) != 0) #define CCTRL_43143_SECI (1<<0) #define CCTRL_43143_BT_LEGACY (1<<1) -#define CCTRL_43143_I2S_MODE (1<<2) -#define CCTRL_43143_I2S_MASTER (1<<3) -#define CCTRL_43143_I2S_FULL (1<<4) -#define CCTRL_43143_GSIO (1<<5) -#define CCTRL_43143_RF_SWCTRL_MASK (7<<6) +#define CCTRL_43143_I2S_MODE (1<<2) +#define CCTRL_43143_I2S_MASTER (1<<3) +#define CCTRL_43143_I2S_FULL (1<<4) +#define CCTRL_43143_GSIO (1<<5) +#define CCTRL_43143_RF_SWCTRL_MASK (7<<6) #define CCTRL_43143_RF_SWCTRL_0 (1<<6) #define CCTRL_43143_RF_SWCTRL_1 (2<<6) #define CCTRL_43143_RF_SWCTRL_2 (4<<6) -#define CCTRL_43143_RF_XSWCTRL (1<<9) -#define CCTRL_43143_HOST_WAKE0 (1<<11) -#define CCTRL_43143_HOST_WAKE1 (1<<12) - - -#define RES43143_EXT_SWITCHER_PWM 0 -#define RES43143_XTAL_PU 1 -#define RES43143_ILP_REQUEST 2 -#define RES43143_ALP_AVAIL 3 -#define RES43143_WL_CORE_READY 4 -#define RES43143_BBPLL_PWRSW_PU 5 -#define RES43143_HT_AVAIL 6 -#define RES43143_RADIO_PU 7 -#define RES43143_MACPHY_CLK_AVAIL 8 -#define RES43143_OTP_PU 9 -#define RES43143_LQ_AVAIL 10 +#define CCTRL_43143_RF_XSWCTRL (1<<9) +#define CCTRL_43143_HOST_WAKE0 (1<<11) +#define CCTRL_43143_HOST_WAKE1 (1<<12) + + +#define RES43143_EXT_SWITCHER_PWM 0 +#define RES43143_XTAL_PU 1 +#define RES43143_ILP_REQUEST 2 +#define RES43143_ALP_AVAIL 3 +#define RES43143_WL_CORE_READY 4 +#define RES43143_BBPLL_PWRSW_PU 5 +#define RES43143_HT_AVAIL 6 +#define RES43143_RADIO_PU 7 +#define RES43143_MACPHY_CLK_AVAIL 8 +#define RES43143_OTP_PU 9 +#define RES43143_LQ_AVAIL 10 #define PMU43143_XTAL_CORE_SIZE_MASK 0x3F @@ -2409,6 +2417,13 @@ typedef volatile struct { #define CCTRL_4360_UART_SEL 0x2 +#define CHIP_HOSTIF_PCIEMODE 0x1 +#define CHIP_HOSTIF_USBMODE 0x2 +#define CHIP_HOSTIF_SDIOMODE 0x4 +#define CHIP_HOSTIF_PCIE(sih) (si_chip_hostif(sih) == CHIP_HOSTIF_PCIEMODE) +#define CHIP_HOSTIF_SDIO(sih) (si_chip_hostif(sih) == CHIP_HOSTIF_SDIOMODE) + + #define RES4335_LPLDO_PO 0 #define RES4335_PMU_BG_PU 1 #define RES4335_PMU_SLEEP 2 @@ -2447,21 +2462,43 @@ typedef volatile struct { #define CST4335_RES_INIT_MODE_SHIFT 7 #define CST4335_RES_INIT_MODE_MASK 0x00000180 #define CST4335_CHIPMODE_MASK 0xF -#define CST4335_CHIPMODE_SDIOD(cs) (((cs) & (1 << 0)) != 0) -#define CST4335_CHIPMODE_GSPI(cs) (((cs) & (1 << 1)) != 0) -#define CST4335_CHIPMODE_USB20D(cs) (((cs) & (1 << 2)) != 0) -#define CST4335_CHIPMODE_PCIE(cs) (((cs) & (1 << 3)) != 0) +#define CST4335_CHIPMODE_SDIOD(cs) (((cs) & (1 << 0)) != 0) +#define CST4335_CHIPMODE_GSPI(cs) (((cs) & (1 << 1)) != 0) +#define CST4335_CHIPMODE_USB20D(cs) (((cs) & (1 << 2)) != 0) +#define CST4335_CHIPMODE_PCIE(cs) (((cs) & (1 << 3)) != 0) -#define CCTRL1_4335_GPIO_SEL (1 << 0) -#define CCTRL1_4335_SDIO_HOST_WAKE (1 << 2) +#define CCTRL1_4335_GPIO_SEL (1 << 0) +#define CCTRL1_4335_SDIO_HOST_WAKE (1 << 2) #define CR4_4335_RAM_BASE (0x180000) +#define PATCHTBL_SIZE (0x800) #define CR4_4350_RAM_BASE (0x180000) #define CR4_4360_RAM_BASE (0x0) +#define SPROM4335_OTP_SELECT 0x00000010 +#define SPROM4335_OTP_PRESENT 0x00000020 + + +#define CC4335_GCI_STRAP_OVERRIDE_SFLASH_PRESENT (1 << 24) +#define CC4335_GCI_STRAP_OVERRIDE_SFLASH_TYPE 25 +#define CC4335_GCI_FUNC_SEL_PAD_SDIO 0x00707770 + + +#define CC4335_SFLASH_CLKDIV_MASK 0x1F000000 +#define CC4335_SFLASH_CLKDIV_SHIFT 25 + + +#define CC4335_SROM_OTP_SFLASH 40 +#define CC4335_SROM_OTP_SFLASH_PRESENT 0x1 +#define CC4335_SROM_OTP_SFLASH_TYPE 0x2 +#define CC4335_SROM_OTP_SFLASH_CLKDIV_MASK 0x003C +#define CC4335_SROM_OTP_SFLASH_CLKDIV_SHIFT 2 + + + #define CST4350_SDIO_MODE 0x00000001 @@ -2515,6 +2552,7 @@ typedef volatile struct { #define CST4350_CHIPMODE_HSIC30D(cs) (CST4350_IFC_MODE(cs) == (CST4350_IFC_MODE_HSIC30D)) #define CST4350_CHIPMODE_USB30D(cs) (CST4350_IFC_MODE(cs) == (CST4350_IFC_MODE_USB30D)) #define CST4350_CHIPMODE_USB30D_WL(cs) (CST4350_IFC_MODE(cs) == (CST4350_IFC_MODE_USB30D_WL)) +#define CST4350_CHIPMODE_PCIE(cs) (CST4350_IFC_MODE(cs) == (CST4350_IFC_MODE_PCIE)) #define RES4350_LPLDO_PU 0 @@ -2562,7 +2600,7 @@ typedef volatile struct { #define CC4350_FNSEL_GCI (7) #define CC4350_FNSEL_MISC1 (8) #define CC4350_FNSEL_MISC2 (9) -#define CC4350_FNSEL_PWDOG (10) +#define CC4350_FNSEL_PWDOG (10) #define CC4350_FNSEL_IND (12) #define CC4350_FNSEL_PDN (13) #define CC4350_FNSEL_PUP (14) @@ -2586,6 +2624,74 @@ typedef volatile struct { #define CC4350_PIN_GPIO_14 (14) #define CC4350_PIN_GPIO_15 (15) +#define CC2_4350_MEMLPLDO_PWRSW_EN_MASK (1 << 21) +#define CC2_4350_MEMLPLDO_PWRSW_EN_SHIFT (21) +#define CC2_4350_SDIO_AOS_WAKEUP_MASK (1 << 24) +#define CC2_4350_SDIO_AOS_WAKEUP_SHIFT (24) + + +#define CC3_SR_CLK_SR_MEM_MASK (1 << 0) +#define CC3_SR_CLK_SR_MEM_SHIFT (0) +#define CC3_SR_BIT1_TBD_MASK (1 << 1) +#define CC3_SR_BIT1_TBD_SHIFT (1) +#define CC3_SR_ENGINE_ENABLE_MASK (1 << 2) +#define CC3_SR_ENGINE_ENABLE_SHIFT (2) +#define CC3_SR_BIT3_TBD_MASK (1 << 3) +#define CC3_SR_BIT3_TBD_SHIFT (3) +#define CC3_SR_MINDIV_FAST_CLK_MASK (0xF << 4) +#define CC3_SR_MINDIV_FAST_CLK_SHIFT (4) +#define CC3_SR_R23_SR2_RISE_EDGE_TRIG_MASK (1 << 8) +#define CC3_SR_R23_SR2_RISE_EDGE_TRIG_SHIFT (8) +#define CC3_SR_R23_SR2_FALL_EDGE_TRIG_MASK (1 << 9) +#define CC3_SR_R23_SR2_FALL_EDGE_TRIG_SHIFT (9) +#define CC3_SR_R23_SR_RISE_EDGE_TRIG_MASK (1 << 10) +#define CC3_SR_R23_SR_RISE_EDGE_TRIG_SHIFT (10) +#define CC3_SR_R23_SR_FALL_EDGE_TRIG_MASK (1 << 11) +#define CC3_SR_R23_SR_FALL_EDGE_TRIG_SHIFT (11) +#define CC3_SR_NUM_CLK_HIGH_MASK (0x7 << 12) +#define CC3_SR_NUM_CLK_HIGH_SHIFT (12) +#define CC3_SR_BIT15_TBD_MASK (1 << 15) +#define CC3_SR_BIT15_TBD_SHIFT (15) +#define CC3_SR_PHY_FUNC_PIC_MASK (1 << 16) +#define CC3_SR_PHY_FUNC_PIC_SHIFT (16) +#define CC3_SR_BIT17_19_TBD_MASK (0x7 << 17) +#define CC3_SR_BIT17_19_TBD_SHIFT (17) +#define CC3_SR_CHIP_TRIGGER_1_MASK (1 << 20) +#define CC3_SR_CHIP_TRIGGER_1_SHIFT (20) +#define CC3_SR_CHIP_TRIGGER_2_MASK (1 << 21) +#define CC3_SR_CHIP_TRIGGER_2_SHIFT (21) +#define CC3_SR_CHIP_TRIGGER_3_MASK (1 << 22) +#define CC3_SR_CHIP_TRIGGER_3_SHIFT (22) +#define CC3_SR_CHIP_TRIGGER_4_MASK (1 << 23) +#define CC3_SR_CHIP_TRIGGER_4_SHIFT (23) +#define CC3_SR_ALLOW_SBC_FUNC_PIC_MASK (1 << 24) +#define CC3_SR_ALLOW_SBC_FUNC_PIC_SHIFT (24) +#define CC3_SR_BIT25_26_TBD_MASK (0x3 << 25) +#define CC3_SR_BIT25_26_TBD_SHIFT (25) +#define CC3_SR_ALLOW_SBC_STBY_MASK (1 << 27) +#define CC3_SR_ALLOW_SBC_STBY_SHIFT (27) +#define CC3_SR_GPIO_MUX_MASK (0xF << 28) +#define CC3_SR_GPIO_MUX_SHIFT (28) + + +#define CC4_SR_INIT_ADDR_MASK (0x3FF0000) +#define CC4_4350_SR_ASM_ADDR (0x30) +#define CC4_4335_SR_ASM_ADDR (0x48) +#define CC4_SR_INIT_ADDR_SHIFT (16) + +#define CC4_4350_EN_SR_CLK_ALP_MASK (1 << 30) +#define CC4_4350_EN_SR_CLK_ALP_SHIFT (30) +#define CC4_4350_EN_SR_CLK_HT_MASK (1 << 31) +#define CC4_4350_EN_SR_CLK_HT_SHIFT (31) + +#define VREG4_4350_MEMLPDO_PU_MASK (1 << 31) +#define VREG4_4350_MEMLPDO_PU_SHIFT 31 + +#define CC6_4350_PCIE_CLKREQ_WAKEUP_MASK (1 << 4) +#define CC6_4350_PCIE_CLKREQ_WAKEUP_SHIFT (4) +#define CC6_4350_PMU_WAKEUP_ALPAVAIL_MASK (1 << 6) +#define CC6_4350_PMU_WAKEUP_ALPAVAIL_SHIFT (6) + #define CC_GCI_CHIPCTRL_00 (0) #define CC_GCI_CHIPCTRL_01 (1) @@ -2597,6 +2703,9 @@ typedef volatile struct { #define CC_GCI_CHIPCTRL_07 (7) #define CC_GCI_CHIPCTRL_08 (8) +#define CC_GCI_06_JTAG_SEL_SHIFT 4 +#define CC_GCI_06_JTAG_SEL_MASK (1 << 4) + #define CC_GCI_NUMCHIPCTRLREGS(cap1) ((cap1 & 0xF00) >> 8) @@ -2660,6 +2769,11 @@ typedef volatile struct { #define MUXENAB4335_UART_MASK (0x0000000f) +#define MUXENAB4335_UART_SHIFT 0 +#define MUXENAB4335_HOSTWAKE_MASK (0x000000f0) +#define MUXENAB4335_HOSTWAKE_SHIFT 4 +#define MUXENAB4335_GETIX(val, name) \ + ((((val) & MUXENAB4335_ ## name ## _MASK) >> MUXENAB4335_ ## name ## _SHIFT) - 1) #define CHIP_HOSTIF_USB(sih) (si_chip_hostif(sih) & CST4360_MODE_USB) diff --git a/drivers/net/wireless/bcmdhd/include/sbconfig.h b/drivers/net/wireless/bcmdhd/include/sbconfig.h index 44d68329e66..6c5cffc88b5 100644 --- a/drivers/net/wireless/bcmdhd/include/sbconfig.h +++ b/drivers/net/wireless/bcmdhd/include/sbconfig.h @@ -1,7 +1,7 @@ /* * Broadcom SiliconBackplane hardware register definitions. * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd/include/sbhnddma.h b/drivers/net/wireless/bcmdhd/include/sbhnddma.h index 811d6833924..3c74668e1ea 100644 --- a/drivers/net/wireless/bcmdhd/include/sbhnddma.h +++ b/drivers/net/wireless/bcmdhd/include/sbhnddma.h @@ -2,7 +2,7 @@ * Generic Broadcom Home Networking Division (HND) DMA engine HW interface * This supports the following chips: BCM42xx, 44xx, 47xx . * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -22,7 +22,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: sbhnddma.h 348178 2012-07-31 22:27:41Z $ + * $Id: sbhnddma.h 373617 2012-12-07 23:03:08Z $ */ #ifndef _sbhnddma_h_ @@ -244,6 +244,18 @@ typedef volatile struct { #define D64RINGBOUNDARY_LARGE (1 << 16) +#define D64_DEF_USBBURSTLEN 2 +#define D64_DEF_SDIOBURSTLEN 1 + + +#ifndef D64_USBBURSTLEN +#define D64_USBBURSTLEN DMA_BL_64 +#endif +#ifndef D64_SDIOBURSTLEN +#define D64_SDIOBURSTLEN DMA_BL_32 +#endif + + #define D64_XC_XE 0x00000001 #define D64_XC_SE 0x00000002 #define D64_XC_LE 0x00000004 @@ -264,7 +276,7 @@ typedef volatile struct { #define D64_XP_LD_MASK 0x00001fff -#define D64_XS0_CD_MASK (di->d64_xs0_cd_mask) +#define D64_XS0_CD_MASK (di->d64_xs0_cd_mask) #define D64_XS0_XS_MASK 0xf0000000 #define D64_XS0_XS_SHIFT 28 #define D64_XS0_XS_DISABLED 0x00000000 @@ -273,7 +285,7 @@ typedef volatile struct { #define D64_XS0_XS_STOPPED 0x30000000 #define D64_XS0_XS_SUSP 0x40000000 -#define D64_XS1_AD_MASK (di->d64_xs1_ad_mask) +#define D64_XS1_AD_MASK (di->d64_xs1_ad_mask) #define D64_XS1_XE_MASK 0xf0000000 #define D64_XS1_XE_SHIFT 28 #define D64_XS1_XE_NOERR 0x00000000 @@ -291,6 +303,7 @@ typedef volatile struct { #define D64_RC_SH 0x00000200 #define D64_RC_OC 0x00000400 #define D64_RC_PD 0x00000800 +#define D64_RC_GE 0x00004000 #define D64_RC_AE 0x00030000 #define D64_RC_AE_SHIFT 16 #define D64_RC_BL_MASK 0x001C0000 @@ -312,7 +325,7 @@ typedef volatile struct { #define D64_RP_LD_MASK 0x00001fff -#define D64_RS0_CD_MASK (di->d64_rs0_cd_mask) +#define D64_RS0_CD_MASK (di->d64_rs0_cd_mask) #define D64_RS0_RS_MASK 0xf0000000 #define D64_RS0_RS_SHIFT 28 #define D64_RS0_RS_DISABLED 0x00000000 diff --git a/drivers/net/wireless/bcmdhd/include/sbpcmcia.h b/drivers/net/wireless/bcmdhd/include/sbpcmcia.h index 5e969215b42..f834a4c7d83 100644 --- a/drivers/net/wireless/bcmdhd/include/sbpcmcia.h +++ b/drivers/net/wireless/bcmdhd/include/sbpcmcia.h @@ -1,7 +1,7 @@ /* * BCM43XX Sonics SiliconBackplane PCMCIA core hardware definitions. * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -21,7 +21,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: sbpcmcia.h 356305 2012-09-12 04:55:06Z $ + * $Id: sbpcmcia.h 381094 2013-01-25 04:45:06Z $ */ #ifndef _SBPCMCIA_H diff --git a/drivers/net/wireless/bcmdhd/include/sbsdio.h b/drivers/net/wireless/bcmdhd/include/sbsdio.h index 35f06e4bee1..51f46c4b498 100644 --- a/drivers/net/wireless/bcmdhd/include/sbsdio.h +++ b/drivers/net/wireless/bcmdhd/include/sbsdio.h @@ -4,7 +4,7 @@ * * SDIO core support 1bit, 4 bit SDIO mode as well as SPI mode. * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -24,7 +24,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: sbsdio.h 369545 2012-11-19 08:38:45Z $ + * $Id: sbsdio.h 383835 2013-02-07 23:32:39Z $ */ #ifndef _SBSDIO_H @@ -119,7 +119,7 @@ */ #define SBSDIO_DEVCTL_EN_F2_BLK_WATERMARK 0x10 /* Enable function 2 tx for each block */ #define SBSDIO_DEVCTL_F2WM_ENAB 0x10 /* Enable F2 Watermark */ -#define SBSDIO_DEVCTL_NONDAT_PADS_ISO 0x20 /* Isolate sdio clk and cmd (non-data) */ +#define SBSDIO_DEVCTL_NONDAT_PADS_ISO 0x20 /* Isolate sdio clk and cmd (non-data) */ /* SBSDIO_FUNC1_CHIPCLKCSR */ #define SBSDIO_FORCE_ALP 0x01 /* Force ALP request to backplane */ diff --git a/drivers/net/wireless/bcmdhd/include/sbsdpcmdev.h b/drivers/net/wireless/bcmdhd/include/sbsdpcmdev.h index 66ff3fe550f..f655eeb139e 100644 --- a/drivers/net/wireless/bcmdhd/include/sbsdpcmdev.h +++ b/drivers/net/wireless/bcmdhd/include/sbsdpcmdev.h @@ -2,7 +2,7 @@ * Broadcom SiliconBackplane SDIO/PCMCIA hardware-specific * device core support * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd/include/sbsocram.h b/drivers/net/wireless/bcmdhd/include/sbsocram.h index 852d1151bc5..30543c0e926 100644 --- a/drivers/net/wireless/bcmdhd/include/sbsocram.h +++ b/drivers/net/wireless/bcmdhd/include/sbsocram.h @@ -1,7 +1,7 @@ /* * BCM47XX Sonics SiliconBackplane embedded ram core * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd/include/sdio.h b/drivers/net/wireless/bcmdhd/include/sdio.h index b8eee1ffb40..0c0dc472cbf 100644 --- a/drivers/net/wireless/bcmdhd/include/sdio.h +++ b/drivers/net/wireless/bcmdhd/include/sdio.h @@ -2,7 +2,7 @@ * SDIO spec header file * Protocol and standard (common) device definitions * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd/include/sdioh.h b/drivers/net/wireless/bcmdhd/include/sdioh.h index 7597901d9fb..80cef235ecc 100644 --- a/drivers/net/wireless/bcmdhd/include/sdioh.h +++ b/drivers/net/wireless/bcmdhd/include/sdioh.h @@ -2,7 +2,7 @@ * SDIO Host Controller Spec header file * Register map and definitions for the Standard Host Controller * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd/include/sdiovar.h b/drivers/net/wireless/bcmdhd/include/sdiovar.h index 16a1c19184e..c2f274aded2 100644 --- a/drivers/net/wireless/bcmdhd/include/sdiovar.h +++ b/drivers/net/wireless/bcmdhd/include/sdiovar.h @@ -2,7 +2,7 @@ * Structure used by apps whose drivers access SDIO drivers. * Pulled out separately so dhdu and wlu can both use it. * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd/include/siutils.h b/drivers/net/wireless/bcmdhd/include/siutils.h index 4a5be1ade4e..622f4bc945e 100644 --- a/drivers/net/wireless/bcmdhd/include/siutils.h +++ b/drivers/net/wireless/bcmdhd/include/siutils.h @@ -2,7 +2,7 @@ * Misc utility routines for accessing the SOC Interconnects * of Broadcom HNBU chips. * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -22,7 +22,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: siutils.h 364853 2012-10-25 18:54:06Z $ + * $Id: siutils.h 385510 2013-02-15 21:02:07Z $ */ #ifndef _siutils_h_ @@ -149,6 +149,7 @@ extern bool si_pci_war16165(si_t *sih); extern uint si_corelist(si_t *sih, uint coreid[]); extern uint si_coreid(si_t *sih); extern uint si_flag(si_t *sih); +extern uint si_flag_alt(si_t *sih); extern uint si_intflag(si_t *sih); extern uint si_coreidx(si_t *sih); extern uint si_coreunit(si_t *sih); @@ -160,6 +161,7 @@ extern uint si_corereg(si_t *sih, uint coreidx, uint regoff, uint mask, uint val extern void *si_coreregs(si_t *sih); extern uint si_wrapperreg(si_t *sih, uint32 offset, uint32 mask, uint32 val); extern uint si_core_wrapperreg(si_t *sih, uint32 coreidx, uint32 offset, uint32 mask, uint32 val); +extern void *si_wrapperregs(si_t *sih); extern uint32 si_core_cflags(si_t *sih, uint32 mask, uint32 val); extern void si_core_cflags_wo(si_t *sih, uint32 mask, uint32 val); extern uint32 si_core_sflags(si_t *sih, uint32 mask, uint32 val); @@ -177,6 +179,7 @@ extern int si_corebist(si_t *sih); extern void si_core_reset(si_t *sih, uint32 bits, uint32 resetbits); extern void si_core_disable(si_t *sih, uint32 bits); extern uint32 si_clock_rate(uint32 pll_type, uint32 n, uint32 m); +extern uint si_chip_hostif(si_t *sih); extern bool si_read_pmu_autopll(si_t *sih); extern uint32 si_clock(si_t *sih); extern uint32 si_alp_clock(si_t *sih); @@ -318,6 +321,7 @@ extern bool si_taclear(si_t *sih, bool details); +extern uint32 si_ccreg(si_t *sih, uint32 offset, uint32 mask, uint32 val); extern uint32 si_pciereg(si_t *sih, uint32 offset, uint32 mask, uint32 val, uint type); extern uint32 si_pcieserdesreg(si_t *sih, uint32 mdioslave, uint32 offset, uint32 mask, uint32 val); extern void si_pcie_set_request_size(si_t *sih, uint16 size); @@ -344,4 +348,20 @@ extern void si_gci_set_functionsel(si_t *sih, uint32 pin, uint8 fnsel); extern uint8 si_gci_get_chipctrlreg_idx(uint32 pin, uint32 *regidx, uint32 *pos); extern uint32 si_gci_chipcontrol(si_t *sih, uint reg, uint32 mask, uint32 val); +#define CHIPCTRLREG2 0x2 +#define CHIPCTRLREG3 0x3 +#define CHIPCTRLREG4 0x4 +#define MINRESMASKREG 0x618 +#define CHIPCTRLADDR 0x650 +#define CHIPCTRLDATA 0x654 +#define RSRCTABLEADDR 0x620 +#define RSRCUPDWNTIME 0x628 +#define PMUREG_RESREQ_MASK 0x68c + +void +si_update_masks(si_t *sih); + +void +si_force_islanding(si_t *sih, bool enable); + #endif diff --git a/drivers/net/wireless/bcmdhd/include/spid.h b/drivers/net/wireless/bcmdhd/include/spid.h index bfe24ff10b2..c4d8493a207 100644 --- a/drivers/net/wireless/bcmdhd/include/spid.h +++ b/drivers/net/wireless/bcmdhd/include/spid.h @@ -1,7 +1,7 @@ /* * SPI device spec header file * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd/include/trxhdr.h b/drivers/net/wireless/bcmdhd/include/trxhdr.h index da4763c89e3..84bd1aecb4f 100644 --- a/drivers/net/wireless/bcmdhd/include/trxhdr.h +++ b/drivers/net/wireless/bcmdhd/include/trxhdr.h @@ -1,7 +1,7 @@ /* * TRX image file header format. * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd/include/typedefs.h b/drivers/net/wireless/bcmdhd/include/typedefs.h index 4eee5bab8ce..c928f32f5bb 100644 --- a/drivers/net/wireless/bcmdhd/include/typedefs.h +++ b/drivers/net/wireless/bcmdhd/include/typedefs.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -18,7 +18,7 @@ * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. - * $Id: typedefs.h 286783 2011-09-29 06:18:57Z $ + * $Id: typedefs.h 397286 2013-04-18 01:42:19Z $ */ #ifndef _TYPEDEFS_H_ @@ -65,6 +65,7 @@ typedef long unsigned int size_t; + #if defined(__sparc__) #define TYPEDEF_ULONG #endif @@ -99,7 +100,7 @@ typedef long unsigned int size_t; #if defined(__GNUC__) && defined(__STRICT_ANSI__) #define TYPEDEF_INT64 #define TYPEDEF_UINT64 -#endif +#endif #if defined(__ICL) diff --git a/drivers/net/wireless/bcmdhd/include/wlfc_proto.h b/drivers/net/wireless/bcmdhd/include/wlfc_proto.h index dfa8db0ff22..0f94ee21104 100644 --- a/drivers/net/wireless/bcmdhd/include/wlfc_proto.h +++ b/drivers/net/wireless/bcmdhd/include/wlfc_proto.h @@ -1,5 +1,5 @@ /* -* Copyright (C) 1999-2012, Broadcom Corporation +* Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -18,7 +18,7 @@ * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. -* $Id: wlfc_proto.h 358262 2012-09-21 21:39:29Z $ +* $Id: wlfc_proto.h 381382 2013-01-27 07:13:00Z $ * */ #ifndef __wlfc_proto_definitions_h__ @@ -34,7 +34,8 @@ --------------------------------------------------------------------------- | 3 | 2 | (count, handle, prec_bmp)| Set the credit depth for a MAC dstn --------------------------------------------------------------------------- - | 4 | 4 | see pkttag comments | TXSTATUS + | 4 | 4+ | see pkttag comments | TXSTATUS + | | | TX status & timestamps | Present only when pkt timestamp is enabled --------------------------------------------------------------------------- | 5 | 4 | see pkttag comments | PKKTTAG [host->firmware] --------------------------------------------------------------------------- @@ -62,6 +63,10 @@ | 13 | 3 | (count, handle, prec_bmp)| One time request for packet to a specific | | | | MAC destination. --------------------------------------------------------------------------- + | 15 | 12 | (pkttag, timestamps) | Send TX timestamp at reception from host + --------------------------------------------------------------------------- + | 16 | 12 | (pkttag, timestamps) | Send WLAN RX timestamp along with RX frame + --------------------------------------------------------------------------- | 255 | N/A | N/A | FILLER - This is a special type | | | | that has no length or value. | | | | Typically used for padding. @@ -87,6 +92,9 @@ #define WLFC_CTL_TYPE_MAC_REQUEST_PACKET 13 #define WLFC_CTL_TYPE_HOST_REORDER_RXPKTS 14 +#define WLFC_CTL_TYPE_TX_ENTRY_STAMP 15 +#define WLFC_CTL_TYPE_RX_STAMP 16 + #define WLFC_CTL_TYPE_TRANS_ID 18 #define WLFC_CTL_TYPE_COMP_TXSTATUS 19 diff --git a/drivers/net/wireless/bcmdhd/include/wlioctl.h b/drivers/net/wireless/bcmdhd/include/wlioctl.h index c1dabc15b13..c3ae201d2d3 100644 --- a/drivers/net/wireless/bcmdhd/include/wlioctl.h +++ b/drivers/net/wireless/bcmdhd/include/wlioctl.h @@ -4,7 +4,7 @@ * * Definitions subject to change without notice. * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -24,7 +24,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: wlioctl.h 384900 2013-02-13 14:23:02Z $ + * $Id: wlioctl.h 443577 2013-12-17 02:32:12Z $ */ #ifndef _wlioctl_h_ @@ -32,6 +32,7 @@ #include #include +#include #include #include #include @@ -43,10 +44,6 @@ #include #endif /* LINUX_POSTMOGRIFY_REMOVAL */ -#ifdef CUSTOMER_HW4 -#include -#endif /* CUSTOMER_HW4 */ - /* LINUX_POSTMOGRIFY_REMOVAL: undefined during compile phase, so its * a no-op for most cases. For hybrid and other open source releases, * its defined during a second pass and mogrified out for distribution. @@ -67,6 +64,12 @@ typedef struct remote_ioctl { } rem_ioctl_t; #define REMOTE_SIZE sizeof(rem_ioctl_t) + +typedef struct { + uint32 num; + chanspec_t list[1]; +} chanspec_list_t; + #define ACTION_FRAME_SIZE 1800 typedef struct wl_action_frame { @@ -363,6 +366,7 @@ typedef struct wl_extdscan_params { #define WL_SCANFLAGS_RESERVED 0x02 /* Reserved */ #define WL_SCANFLAGS_PROHIBITED 0x04 /* allow scanning prohibited channels */ #define WL_SCANFLAGS_OFFCHAN 0x08 /* allow scanning/reporting off-channel APs */ +#define WL_SCANFLAGS_HOTSPOT 0x10 /* automatic ANQP to hotspot APs */ #define WL_SCAN_PARAMS_SSID_MAX 10 @@ -1030,7 +1034,6 @@ typedef struct { #define WPA_AUTH_PFN_ANY 0xffffffff /* for PFN, match only ssid */ /* pmkid */ -/* Due to pmkid_info driver IOVar/dhd implementation, leave this as 16 for now. */ #define MAXPMKID 16 typedef struct _pmkid { @@ -1743,7 +1746,8 @@ typedef struct wlc_iov_trx_s { /* #define WLC_SET_WAI_REKEY 315 */ /* for WAPI, deprecated use iovar instead */ #define WLC_SET_NAT_CONFIG 316 /* for configuring NAT filter driver */ #define WLC_GET_NAT_STATE 317 -#define WLC_LAST 318 +#define WLC_GET_RSSI_QDB 318 /* qdB portion of the RSSI */ +#define WLC_LAST 319 #ifndef EPICTRL_COOKIE #define EPICTRL_COOKIE 0xABADCEDE @@ -1814,7 +1818,11 @@ typedef struct { /* WLC_GET_AUTH, WLC_SET_AUTH values */ #define WL_AUTH_OPEN_SYSTEM 0 /* d11 open authentication */ #define WL_AUTH_SHARED_KEY 1 /* d11 shared authentication */ -#define WL_AUTH_OPEN_SHARED 2 /* try open, then shared if open failed w/rc 13 */ +#if (defined(BCM4334_CHIP) || defined(BCM43341_CHIP)) && defined(CUSTOMER_HW4) +#define WL_AUTH_OPEN_SHARED 3 /* try open, then shared if open failed w/rc 13 */ +#else +#define WL_AUTH_OPEN_SHARED 2 /* try open, then shared if open failed w/rc 13 */ +#endif #endif /* LINUX_POSTMOGRIFY_REMOVAL */ /* Bit masks for radio disabled status - returned by WL_GET_RADIO */ @@ -1827,6 +1835,17 @@ typedef struct { #define WL_SPURAVOID_ON1 1 #define WL_SPURAVOID_ON2 2 + +#define WL_4335_SPURAVOID_ON1 1 +#define WL_4335_SPURAVOID_ON2 2 +#define WL_4335_SPURAVOID_ON3 3 +#define WL_4335_SPURAVOID_ON4 4 +#define WL_4335_SPURAVOID_ON5 5 +#define WL_4335_SPURAVOID_ON6 6 +#define WL_4335_SPURAVOID_ON7 7 +#define WL_4335_SPURAVOID_ON8 8 +#define WL_4335_SPURAVOID_ON9 9 + /* Override bit for WLC_SET_TXPWR. if set, ignore other level limits */ #define WL_TXPWR_OVERRIDE (1U<<31) #define WL_TXPWR_NEG (1U<<30) @@ -2125,7 +2144,7 @@ typedef struct wl_sampledata { /* WL_OTA START */ -#define WL_OTA_ARG_PARSE_BLK_SIZE 1200 +#define WL_OTA_ARG_PARSE_BLK_SIZE 1200 #define WL_OTA_TEST_MAX_NUM_RATE 30 #define WL_OTA_TEST_MAX_NUM_SEQ 100 @@ -2763,7 +2782,7 @@ typedef struct { chanspec_t chanspec; /* txpwr report for this channel */ chanspec_t local_chanspec; /* channel on which we are associated */ uint32 buflen; /* ppr buffer length */ - uint8 pprbuf[1]; /* Latest target power buffer buffer */ + uint8 pprbuf[1]; /* Latest target power buffer */ } wl_txppr_t; #define WL_TXPPR_VERSION 0 @@ -2774,7 +2793,7 @@ typedef struct { #define WL_BW_20MHZ 0 #define WL_BW_40MHZ 1 #define WL_BW_80MHZ 2 -#define WL_BW_160MHZ 3 +#define WL_BW_160MHZ 3 /* tx_power_t.flags bits */ /* use for defined PPR_API */ @@ -2954,11 +2973,19 @@ typedef struct wl_txchain_pwr_offsets { #define WL_PSTA_VAL 0x00008000 #define WL_TBTT_VAL 0x00010000 #define WL_NIC_VAL 0x00020000 -#define WL_PWRSEL_VAL 0x00040000 -#define WL_TRF_MGMT_VAL 0x00080000 -#define WL_L2FILTER_VAL 0x00100000 +#define WL_PWRSEL_VAL 0x00040000 +#define WL_TRF_MGMT_VAL 0x00080000 +#define WL_L2FILTER_VAL 0x00100000 #define WL_TSO_VAL 0x00200000 #define WL_MQ_VAL 0x00400000 +/* These 3 levels are currently not used in trunk but in Aardvark and Phoenix2 with != values */ +#define WL_LPC_VAL 0x00800000 +#define WL_TXBF_VAL 0x01000000 +#define WL_P2PO_VAL 0x02000000 +/* This level is synchronized with other branches */ +#define WL_WNM_VAL 0x04000000 +/* This level is currently not used in trunk but used in Phoenix2 */ +#define WL_SRSCAN_VAL 0x08000000 /* use top-bit for WL_TIME_STAMP_VAL because this is a modifier * rather than a message-type of its own @@ -3011,8 +3038,8 @@ typedef struct wl_txchain_pwr_offsets { #define WL_WDS_WPA_ROLE_SUP 1 /* supplicant */ #define WL_WDS_WPA_ROLE_AUTO 255 /* auto, based on mac addr value */ -/* number of bytes needed to define a 128-bit mask for MAC event reporting */ -#define WL_EVENTING_MASK_LEN 16 +/* number of bytes needed to define a mask for MAC event reporting */ +#define WL_EVENTING_MASK_LEN ((WLC_E_LAST + 7) / 8) /* * Join preference iovar value is an array of tuples. Each tuple has a one-byte type, @@ -3321,7 +3348,7 @@ typedef struct { uint32 unchained; /* number of frames not chained */ uint32 maxchainsz; /* max chain size so far */ uint32 currchainsz; /* current chain size */ - uint32 cso_normal; /* hw cso hdr for normal process */ + uint32 cso_normal; /* hw cso hdr for normal process */ } wl_cnt_t; #ifndef LINUX_POSTMOGRIFY_REMOVAL @@ -3593,6 +3620,22 @@ typedef struct { uint32 rx486mbps; /* packets rx at 486 mbps */ uint32 rx540mbps; /* packets rx at 540 mbps */ } wl_delta_stats_t; + +/* structure to store per-rate rx statistics */ +typedef struct wl_scb_rx_rate_stats { + uint32 rx1mbps[2]; /* packets rx at 1Mbps */ + uint32 rx2mbps[2]; /* packets rx at 2Mbps */ + uint32 rx5mbps5[2]; /* packets rx at 5.5Mbps */ + uint32 rx6mbps[2]; /* packets rx at 6Mbps */ + uint32 rx9mbps[2]; /* packets rx at 9Mbps */ + uint32 rx11mbps[2]; /* packets rx at 11Mbps */ + uint32 rx12mbps[2]; /* packets rx at 12Mbps */ + uint32 rx18mbps[2]; /* packets rx at 18Mbps */ + uint32 rx24mbps[2]; /* packets rx at 24Mbps */ + uint32 rx36mbps[2]; /* packets rx at 36Mbps */ + uint32 rx48mbps[2]; /* packets rx at 48Mbps */ + uint32 rx54mbps[2]; /* packets rx at 54Mbps */ +} wl_scb_rx_rate_stats_t; #endif /* LINUX_POSTMOGRIFY_REMOVAL */ #define WL_WME_CNT_VERSION 1 /* current version of wl_wme_cnt_t */ @@ -3780,11 +3823,11 @@ typedef struct tdls_iovar { } tdls_iovar_t; /* modes */ -#define TDLS_WFD_IE_TX 0 -#define TDLS_WFD_IE_RX 1 +#define TDLS_WFD_IE_TX 0 +#define TDLS_WFD_IE_RX 1 #define TDLS_WFD_PROBE_IE_TX 2 #define TDLS_WFD_PROBE_IE_RX 3 -#define TDLS_WFD_IE_SIZE 512 +#define TDLS_WFD_IE_SIZE 512 /* structure for tdls wfd ie */ typedef struct tdls_wfd_ie_iovar { struct ether_addr ea; /* Station address */ @@ -3921,14 +3964,16 @@ enum { #define SORT_CRITERIA_BIT 0 #define AUTO_NET_SWITCH_BIT 1 -#define ENABLE_BKGRD_SCAN_BIT 2 +#define ENABLE_BKGRD_SCAN_BIT 2 #define IMMEDIATE_SCAN_BIT 3 #define AUTO_CONNECT_BIT 4 #define ENABLE_BD_SCAN_BIT 5 -#define ENABLE_ADAPTSCAN_BIT 6 +#define ENABLE_ADAPTSCAN_BIT 6 #define IMMEDIATE_EVENT_BIT 8 #define SUPPRESS_SSID_BIT 9 #define ENABLE_NET_OFFLOAD_BIT 10 +/* report found/lost events for SSID and BSSID networks seperately */ +#define REPORT_SEPERATELY_BIT 11 #define SORT_CRITERIA_MASK 0x0001 #define AUTO_NET_SWITCH_MASK 0x0002 @@ -3941,6 +3986,8 @@ enum { #define IMMEDIATE_EVENT_MASK 0x0100 #define SUPPRESS_SSID_MASK 0x0200 #define ENABLE_NET_OFFLOAD_MASK 0x0400 +/* report found/lost events for SSID and BSSID networks seperately */ +#define REPORT_SEPERATELY_MASK 0x0800 #define PFN_VERSION 2 #define PFN_SCANRESULT_VERSION 1 @@ -3954,6 +4001,9 @@ enum { #define DEFAULT_REPEAT 10 #define DEFAULT_EXP 2 +#define PFN_PARTIAL_SCAN_BIT 0 +#define PFN_PARTIAL_SCAN_MASK 1 + /* PFN network info structure */ typedef struct wl_pfn_subnet_info { struct ether_addr BSSID; @@ -3968,6 +4018,22 @@ typedef struct wl_pfn_net_info { uint16 timestamp; /* age in seconds */ } wl_pfn_net_info_t; +typedef struct wl_pfn_lnet_info { + wl_pfn_subnet_info_t pfnsubnet; /* BSSID + channel + SSID len + SSID */ + uint16 flags; /* partial scan, etc */ + int16 RSSI; /* receive signal strength (in dBm) */ + uint32 timestamp; /* age in miliseconds */ + uint16 rtt0; /* estimated distance to this AP in centimeters */ + uint16 rtt1; /* standard deviation of the distance to this AP in centimeters */ +} wl_pfn_lnet_info_t; + +typedef struct wl_pfn_lscanresults { + uint32 version; + uint32 status; + uint32 count; + wl_pfn_lnet_info_t netinfo[1]; +} wl_pfn_lscanresults_t; + typedef struct wl_pfn_scanresults { uint32 version; uint32 status; @@ -4009,14 +4075,18 @@ typedef struct wl_pfn_bssid { #define WL_PFN_RSSI_SHIFT 8 typedef struct wl_pfn_cfg { - uint32 reporttype; - int32 channel_num; - uint16 channel_list[WL_NUMCHANNELS]; + uint32 reporttype; + int32 channel_num; + uint16 channel_list[WL_NUMCHANNELS]; + uint32 flags; } wl_pfn_cfg_t; #define WL_PFN_REPORT_ALLNET 0 #define WL_PFN_REPORT_SSIDNET 1 #define WL_PFN_REPORT_BSSIDNET 2 +#define WL_PFN_CFG_FLAGS_PROHIBITED 0x00000001 /* Accept and use prohibited channels */ +#define WL_PFN_CFG_FLAGS_RESERVED 0xfffffffe /* Remaining reserved for future use */ + typedef struct wl_pfn { wlc_ssid_t ssid; /* ssid name and its length */ int32 flags; /* bit2: hidden */ @@ -4025,14 +4095,78 @@ typedef struct wl_pfn { int32 wpa_auth; /* WPA type */ int32 wsec; /* wsec value */ } wl_pfn_t; +typedef struct wl_pfn_list { + uint32 version; + uint32 enabled; + uint32 count; + wl_pfn_t pfn[1]; +} wl_pfn_list_t; #define WL_PFN_HIDDEN_BIT 2 #define PNO_SCAN_MAX_FW 508*1000 /* max time scan time in msec */ #define PNO_SCAN_MAX_FW_SEC PNO_SCAN_MAX_FW/1000 /* max time scan time in SEC */ #define PNO_SCAN_MIN_FW_SEC 10 /* min time scan time in SEC */ #define WL_PFN_HIDDEN_MASK 0x4 +#ifndef BESTN_MAX +#define BESTN_MAX 3 +#endif + +#ifndef MSCAN_MAX +#define MSCAN_MAX 90 +#endif #endif /* LINUX_POSTMOGRIFY_REMOVAL */ +/* Service discovery */ +typedef struct { + uint8 transaction_id; /* Transaction id */ + uint8 protocol; /* Service protocol type */ + uint16 query_len; /* Length of query */ + uint16 response_len; /* Length of response */ + uint8 qrbuf[1]; +} wl_p2po_qr_t; + +typedef struct { + uint16 period; /* extended listen period */ + uint16 interval; /* extended listen interval */ +} wl_p2po_listen_t; + +/* ANQP offload */ + +#define ANQPO_MAX_QUERY_SIZE 256 +typedef struct { + uint16 max_retransmit; /* -1 use default, max retransmit on no ACK from peer */ + uint16 response_timeout; /* -1 use default, msec to wait for resp after tx packet */ + uint16 max_comeback_delay; /* -1 use default, max comeback delay in resp else fail */ + uint16 max_retries; /* -1 use default, max retries on failure */ + uint16 query_len; /* length of ANQP query */ + uint8 query_data[1]; /* ANQP encoded query (max ANQPO_MAX_QUERY_SIZE) */ +} wl_anqpo_set_t; + +typedef struct { + uint16 channel; /* channel of the peer */ + struct ether_addr addr; /* addr of the peer */ +} wl_anqpo_peer_t; + +#define ANQPO_MAX_PEER_LIST 64 +typedef struct { + uint16 count; /* number of peers in list */ + wl_anqpo_peer_t peer[1]; /* max ANQPO_MAX_PEER_LIST */ +} wl_anqpo_peer_list_t; + +#define ANQPO_MAX_IGNORE_SSID 64 +typedef struct { + bool is_clear; /* set to clear list (not used on GET) */ + uint16 count; /* number of SSID in list */ + wlc_ssid_t ssid[1]; /* max ANQPO_MAX_IGNORE_SSID */ +} wl_anqpo_ignore_ssid_list_t; + +#define ANQPO_MAX_IGNORE_BSSID 64 +typedef struct { + bool is_clear; /* set to clear list (not used on GET) */ + uint16 count; /* number of addr in list */ + struct ether_addr bssid[1]; /* max ANQPO_MAX_IGNORE_BSSID */ +} wl_anqpo_ignore_bssid_list_t; + /* TCP Checksum Offload defines */ #define TOE_TX_CSUM_OL 0x00000001 #define TOE_RX_CSUM_OL 0x00000002 @@ -4138,6 +4272,16 @@ typedef struct wl_keep_alive_pkt { * Dongle pattern matching filter. */ +/* Packet filter operation mode */ +/* True: 1; False: 0 */ +#define PKT_FILTER_MODE_FORWARD_ON_MATCH 1 +/* Enable and disable pkt_filter as a whole */ +#define PKT_FILTER_MODE_DISABLE 2 +/* Cache first matched rx pkt(be queried by host later) */ +#define PKT_FILTER_MODE_PKT_CACHE_ON_MATCH 4 +/* If pkt_filter is enabled and no filter is set, don't forward anything */ +#define PKT_FILTER_MODE_PKT_FORWARD_OFF_DEFAULT 8 + /* Packet filter types. Currently, only pattern matching is supported. */ typedef enum wl_pkt_filter_type { WL_PKT_FILTER_TYPE_PATTERN_MATCH /* Pattern matching filter */ @@ -4193,6 +4337,15 @@ typedef struct wl_pkt_filter_stats { uint32 num_pkts_discarded; /* # packets discarded by dongle for all filters */ } wl_pkt_filter_stats_t; +#define RSN_KCK_LENGTH 16 +#define RSN_KEK_LENGTH 16 +#define RSN_REPLAY_LEN 8 +typedef struct _gtkrefresh { + uchar KCK[RSN_KCK_LENGTH]; + uchar KEK[RSN_KEK_LENGTH]; + uchar ReplayCounter[RSN_REPLAY_LEN]; +} gtk_keyinfo_t, *pgtk_keyinfo_t; + /* Sequential Commands ioctl */ typedef struct wl_seq_cmd_ioctl { uint32 cmd; /* common ioctl definition */ @@ -4246,6 +4399,7 @@ typedef struct wl_pkteng_stats { int32 rssi; /* RSSI */ int32 snr; /* signal to noise ratio */ uint16 rxpktcnt[NUM_80211_RATES+1]; + uint8 rssi_qdb; /* qdB portion of the computed rssi */ } wl_pkteng_stats_t; @@ -4598,6 +4752,36 @@ typedef struct { #endif /* LINUX_POSTMOGRIFY_REMOVAL */ +#define BSS_PEER_INFO_PARAM_CUR_VER 0 +/* Input structure for IOV_BSS_PEER_INFO */ +typedef BWL_PRE_PACKED_STRUCT struct { + uint16 version; + struct ether_addr ea; /* peer MAC address */ +} BWL_POST_PACKED_STRUCT bss_peer_info_param_t; + +#define BSS_PEER_INFO_CUR_VER 0 + +typedef BWL_PRE_PACKED_STRUCT struct { + uint16 version; + struct ether_addr ea; + int32 rssi; + uint32 tx_rate; /* current tx rate */ + uint32 rx_rate; /* current rx rate */ + wl_rateset_t rateset; /* rateset in use */ + uint32 age; /* age in seconds */ +} BWL_POST_PACKED_STRUCT bss_peer_info_t; + +#define BSS_PEER_LIST_INFO_CUR_VER 0 + +typedef BWL_PRE_PACKED_STRUCT struct { + uint16 version; + uint16 bss_peer_info_len; /* length of bss_peer_info_t */ + uint32 count; /* number of peer info */ + bss_peer_info_t peer_info[1]; /* peer info */ +} BWL_POST_PACKED_STRUCT bss_peer_list_info_t; + +#define BSS_PEER_LIST_INFO_FIXED_LEN OFFSETOF(bss_peer_list_info_t, peer_info) + /* no default structure packing */ #include @@ -4739,8 +4923,28 @@ typedef BWL_PRE_PACKED_STRUCT struct { uint8 pprdata[1]; /* ppr serialization buffer */ } BWL_POST_PACKED_STRUCT tx_pwr_rpt_t; +typedef BWL_PRE_PACKED_STRUCT struct { + struct ipv4_addr ipv4_addr; + struct ether_addr nexthop; +} BWL_POST_PACKED_STRUCT ibss_route_entry_t; +typedef BWL_PRE_PACKED_STRUCT struct { + uint32 num_entry; + ibss_route_entry_t route_entry[1]; +} BWL_POST_PACKED_STRUCT ibss_route_tbl_t; + +#define MAX_IBSS_ROUTE_TBL_ENTRY 64 #endif /* LINUX_POSTMOGRIFY_REMOVAL */ +#define AIBSS_TXFAIL_CONFIG_VER_0 0 + +/* structure used to configure AIBSS beacon force xmit */ +typedef BWL_PRE_PACKED_STRUCT struct { + uint16 version; + uint16 len; + uint32 bcn_timeout; /* dur in seconds to receive 1 bcn */ + uint32 max_tx_retry; /* no of consecutive no acks to send txfail event */ +} BWL_POST_PACKED_STRUCT aibss_txfail_config_t; + /* no strict structure packing */ #include @@ -5460,6 +5664,80 @@ typedef struct txdelay_params { uint8 tune; /* Debug */ } txdelay_params_t; +#define WL_RELMCAST_MAX_CLIENT 32 +#define WL_RELMCAST_FLAG_INBLACKLIST 1 +#define WL_RELMCAST_FLAG_ACTIVEACKER 2 +#define WL_RELMCAST_FLAG_RELMCAST 4 +#define WL_RELMCAST_MAX_TABLE_ENTRY 4 + +#define WL_RELMCAST_VER 1 +#define WL_RELMCAST_INDEX_ACK_ALL 255 +#define WL_RELMCAST_NUM_OF_MC_STREAMS 4 +#define WL_RELMCAST_MAX_TRS_PER_GROUP 1 +#define WL_RELMCAST_ACK_MCAST0 0x02 +#define WL_RELMCAST_ACK_MCAST_ALL 0x01 +#define WL_RELMCAST_ACTF_TIME_MIN 300 /* time in ms */ +#define WL_RELMCAST_ACTF_TIME_MAX 20000 /* time in ms */ + +enum { + RELMCAST_ENTRY_OP_DISABLE = 0, + RELMCAST_ENTRY_OP_DELETE, + RELMCAST_ENTRY_OP_ENABLE, + RELMCAST_ENTRY_OP_ACK_ALL +}; + +enum { + WL_RELMCAST_MODE_RECEIVER = 0, + WL_RELMCAST_MODE_TRANSMITTER, + WL_RELMCAST_MODE_INITIATOR +}; + +typedef struct wl_relmcast_client { + uint8 flag; + int16 rssi; + struct ether_addr addr; +} wl_relmcast_client_t; + +typedef struct wl_relmcast_st { + uint8 ver; + uint8 num; + wl_relmcast_client_t clients[WL_RELMCAST_MAX_CLIENT]; + uint16 err; +} wl_relmcast_status_t; + +typedef struct wl_relmcast_entry { + int8 flag; + struct ether_addr addr; +} wl_relmcast_entry_t; + +typedef struct wl_relmcast_entry_table { + int8 index; + int8 opcode; + wl_relmcast_entry_t entry[WL_RELMCAST_MAX_TABLE_ENTRY]; +} wl_relmcast_entry_table_t; + +typedef struct wl_tr_Info { + struct ether_addr addr; + uint32 timeVal; + uint16 seq; +} wl_tr_Info_t; + +typedef struct wl_mcGrpEntry { + struct ether_addr mcaddr; + struct ether_addr ar; + wl_tr_Info_t trInfo[WL_RELMCAST_MAX_TRS_PER_GROUP]; +} wl_mcGrpEntry_t; + +typedef struct wl_mcAckAllEntry { + struct ether_addr ar; + wl_tr_Info_t trInfo[WL_RELMCAST_NUM_OF_MC_STREAMS]; +} wl_mcAckAllEntry_t; + +typedef struct wl_relmcast_globalMcTbl { + uint8 activeMask; + wl_mcAckAllEntry_t ackAll; + wl_mcGrpEntry_t mcEntry[WL_RELMCAST_NUM_OF_MC_STREAMS]; +} wl_relmcast_globalMcTbl_t; #endif /* LINUX_POSTMOGRIFY_REMOVAL */ /* fbt_cap: FBT assoc / reassoc modes. */ @@ -5503,17 +5781,15 @@ typedef struct statreq { uint16 reps; } statreq_t; -#ifdef EVENT_LOG_COMPILE -typedef struct wlc_event_log_set_s { +typedef struct wl_el_set_params_s { uint8 set; /* Set number */ uint32 size; /* Size to make/expand */ -} wlc_event_log_set_t; +} wl_el_set_params_t; -typedef struct wlc_event_log_tag_s { +typedef struct wl_el_tag_params_s { uint16 tag; uint8 set; uint8 flags; -} wlc_event_log_tag_t; -#endif /* EVENT_LOG_COMPILE */ +} wl_el_tag_params_t; #endif /* _wlioctl_h_ */ diff --git a/drivers/net/wireless/bcmdhd/linux_osl.c b/drivers/net/wireless/bcmdhd/linux_osl.c index d1849639529..d2f1f7d9786 100644 --- a/drivers/net/wireless/bcmdhd/linux_osl.c +++ b/drivers/net/wireless/bcmdhd/linux_osl.c @@ -1,7 +1,7 @@ /* * Linux OS Independent Layer * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -21,7 +21,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: linux_osl.c 412210 2013-07-12 07:12:46Z $ + * $Id: linux_osl.c 412994 2013-07-17 12:38:03Z $ */ #define LINUX_PORT @@ -36,6 +36,7 @@ #include + #include #define PCI_CFG_RETRY 10 @@ -44,7 +45,7 @@ #define BCM_MEM_FILENAME_LEN 24 #ifdef CONFIG_DHD_USE_STATIC_BUF -#define DHD_SKB_HDRSIZE 336 +#define DHD_SKB_HDRSIZE 336 #define DHD_SKB_1PAGE_BUFSIZE ((PAGE_SIZE*1)-DHD_SKB_HDRSIZE) #define DHD_SKB_2PAGE_BUFSIZE ((PAGE_SIZE*2)-DHD_SKB_HDRSIZE) #define DHD_SKB_4PAGE_BUFSIZE ((PAGE_SIZE*4)-DHD_SKB_HDRSIZE) @@ -68,7 +69,7 @@ static bcm_static_buf_t *bcm_static_buf = 0; #else #define STATIC_PKT_4PAGE_NUM 0 #define DHD_SKB_MAX_BUFSIZE DHD_SKB_2PAGE_BUFSIZE -#endif +#endif typedef struct bcm_static_pkt { struct sk_buff *skb_4k[STATIC_PKT_MAX_NUM]; @@ -100,7 +101,7 @@ struct osl_info { uint magic; void *pdev; atomic_t malloced; - atomic_t pktalloced; + atomic_t pktalloced; uint failed; uint bustype; bcm_mem_link_t *dbgmem_list; @@ -167,13 +168,12 @@ static int16 linuxbcmerrormap[] = -ENODEV, -EINVAL, -ENODATA, + -EINVAL, + -EINVAL, + -EIO, + -EIO, - -#if BCME_LAST != -42 -#error "You need to add a OS error translation in the linuxbcmerrormap \ - for new error code defined in bcmutils.h" -#endif }; @@ -195,8 +195,14 @@ osl_t * osl_attach(void *pdev, uint bustype, bool pkttag) { osl_t *osh; + gfp_t flags; - if (!(osh = kmalloc(sizeof(osl_t), GFP_ATOMIC))) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25)) + flags = (in_atomic() || irqs_disabled()) ? GFP_ATOMIC : GFP_KERNEL; +#else + flags = GFP_ATOMIC; +#endif + if (!(osh = kmalloc(sizeof(osl_t), flags))) return osh; ASSERT(osh); @@ -238,6 +244,10 @@ osl_attach(void *pdev, uint bustype, bool pkttag) if (!(bcm_static_buf = (bcm_static_buf_t *)dhd_os_prealloc(osh, 3, STATIC_BUF_SIZE+ STATIC_BUF_TOTAL_LEN))) { printk("can not alloc static buf!\n"); + bcm_static_skb = NULL; + ASSERT(osh->magic == OS_HANDLE_MAGIC); + kfree(osh); + return NULL; } else printk("alloc static buf at %x!\n", (unsigned int)bcm_static_buf); @@ -253,6 +263,14 @@ osl_attach(void *pdev, uint bustype, bool pkttag) void *skb_buff_ptr = 0; bcm_static_skb = (bcm_static_pkt_t *)((char *)bcm_static_buf + 2048); skb_buff_ptr = dhd_os_prealloc(osh, 4, 0); + if (!skb_buff_ptr) { + printk("cannot alloc static buf!\n"); + bcm_static_buf = NULL; + bcm_static_skb = NULL; + ASSERT(osh->magic == OS_HANDLE_MAGIC); + kfree(osh); + return NULL; + } bcopy(skb_buff_ptr, bcm_static_skb, sizeof(struct sk_buff *) * (STATIC_PKT_MAX_NUM * 2 + STATIC_PKT_4PAGE_NUM)); @@ -263,6 +281,7 @@ osl_attach(void *pdev, uint bustype, bool pkttag) } #endif + spin_lock_init(&(osh->pktalloc_lock)); return osh; @@ -287,16 +306,17 @@ osl_detach(osl_t *osh) kfree(osh); } -static struct sk_buff *osl_alloc_skb(unsigned int len) +static struct sk_buff *osl_alloc_skb(osl_t *osh, unsigned int len) { -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25) struct sk_buff *skb; +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25) + gfp_t flags = (in_atomic() || irqs_disabled()) ? GFP_ATOMIC : GFP_KERNEL; - skb = __dev_alloc_skb(len, GFP_ATOMIC); - return skb; + skb = __dev_alloc_skb(len, flags); #else - return dev_alloc_skb(len); -#endif + skb = dev_alloc_skb(len); +#endif + return skb; } #ifdef CTFPOOL @@ -330,7 +350,7 @@ osl_ctfpool_add(osl_t *osh) } - skb = osl_alloc_skb(osh->ctfpool->obj_size); + skb = osl_alloc_skb(osh, osh->ctfpool->obj_size); if (skb == NULL) { printf("%s: skb alloc of len %d failed\n", __FUNCTION__, osh->ctfpool->obj_size); @@ -373,9 +393,15 @@ osl_ctfpool_replenish(osl_t *osh, uint thresh) int32 osl_ctfpool_init(osl_t *osh, uint numobj, uint size) { - osh->ctfpool = kmalloc(sizeof(ctfpool_t), GFP_ATOMIC); + gfp_t flags; + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25)) + flags = (in_atomic() || irqs_disabled()) ? GFP_ATOMIC : GFP_KERNEL; +#else + flags = GFP_ATOMIC; +#endif + osh->ctfpool = kzalloc(sizeof(ctfpool_t), flags); ASSERT(osh->ctfpool); - bzero(osh->ctfpool, sizeof(ctfpool_t)); osh->ctfpool->max_obj = numobj; osh->ctfpool->obj_size = size; @@ -484,9 +510,13 @@ osl_pktfastget(osl_t *osh, uint len) skb->next = skb->prev = NULL; +#if defined(__ARM_ARCH_7A__) + skb->data = skb->head + NET_SKB_PAD; + skb->tail = skb->head + NET_SKB_PAD; +#else skb->data = skb->head + 16; skb->tail = skb->head + 16; - +#endif skb->len = 0; skb->cloned = 0; #if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 14) @@ -512,6 +542,7 @@ osl_pkt_tonative(osl_t *osh, void *pkt) for (nskb = (struct sk_buff *)pkt; nskb; nskb = nskb->next) { atomic_sub(PKTISCHAINED(nskb) ? PKTCCNT(nskb) : 1, &osh->pktalloced); + } return (struct sk_buff *)pkt; } @@ -528,6 +559,7 @@ osl_pkt_frmnative(osl_t *osh, void *pkt) for (nskb = (struct sk_buff *)pkt; nskb; nskb = nskb->next) { atomic_add(PKTISCHAINED(nskb) ? PKTCCNT(nskb) : 1, &osh->pktalloced); + } return (void *)pkt; } @@ -541,11 +573,12 @@ osl_pktget(osl_t *osh, uint len) #ifdef CTFPOOL skb = osl_pktfastget(osh, len); - if ((skb != NULL) || ((skb = osl_alloc_skb(len)) != NULL)) { + if ((skb != NULL) || ((skb = osl_alloc_skb(osh, len)) != NULL)) { #else - if ((skb = osl_alloc_skb(len))) { + if ((skb = osl_alloc_skb(osh, len))) { #endif - skb_put(skb, len); + skb->tail += len; + skb->len += len; skb->priority = 0; atomic_inc(&osh->pktalloced); @@ -604,6 +637,7 @@ void BCMFASTPATH osl_pktfree(osl_t *osh, void *p, bool send) { struct sk_buff *skb, *nskb; + if (osh == NULL) { printk("%s: osh == NULL \n", __FUNCTION__); @@ -625,13 +659,15 @@ osl_pktfree(osl_t *osh, void *p, bool send) #ifdef CTFPOOL - if ((PKTISFAST(osh, skb)) && (atomic_read(&skb->users) == 1)) + if (PKTISFAST(osh, skb)) { + if (atomic_read(&skb->users) == 1) + smp_rmb(); + else if (!atomic_dec_and_test(&skb->users)) + goto next_skb; osl_pktfastfree(osh, skb); - else { -#else + } else +#endif { -#endif - if (skb->destructor) dev_kfree_skb_any(skb); @@ -639,6 +675,9 @@ osl_pktfree(osl_t *osh, void *p, bool send) dev_kfree_skb(skb); } +#ifdef CTFPOOL +next_skb: +#endif atomic_dec(&osh->pktalloced); skb = nskb; } @@ -749,10 +788,11 @@ osl_pktfree_static(osl_t *osh, void *p, bool send) } #endif -int osh_pktpadtailroom(osl_t *osh, struct sk_buff* skb, int pad) +int osh_pktpadtailroom(osl_t *osh, void* p, int pad) { int err; int ntail; + struct sk_buff* skb = (struct sk_buff*)p; ntail = skb->data_len + pad - (skb->end - skb->tail); if (likely(skb_cloned(skb) || ntail > 0)) { @@ -864,6 +904,7 @@ void * osl_malloc(osl_t *osh, uint size) { void *addr; + gfp_t flags; if (osh) @@ -903,7 +944,12 @@ osl_malloc(osl_t *osh, uint size) original: #endif - if ((addr = kmalloc(size, GFP_ATOMIC)) == NULL) { +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25)) + flags = (in_atomic() || irqs_disabled()) ? GFP_ATOMIC : GFP_KERNEL; +#else + flags = GFP_ATOMIC; +#endif + if ((addr = kmalloc(size, flags)) == NULL) { if (osh) osh->failed++; return (NULL); @@ -970,6 +1016,7 @@ osl_dma_consistent_align(void) void* osl_dma_alloc_consistent(osl_t *osh, uint size, uint16 align_bits, uint *alloced, ulong *pap) { + void *va; uint16 align = (1 << align_bits); ASSERT((osh && (osh->magic == OS_HANDLE_MAGIC))); @@ -977,7 +1024,14 @@ osl_dma_alloc_consistent(osl_t *osh, uint size, uint16 align_bits, uint *alloced size += align; *alloced = size; - return (pci_alloc_consistent(osh->pdev, size, (dma_addr_t*)pap)); +#ifdef __ARM_ARCH_7A__ + va = kmalloc(size, GFP_ATOMIC | __GFP_ZERO); + if (va) + *pap = (ulong)__virt_to_phys((ulong)va); +#else + va = pci_alloc_consistent(osh->pdev, size, (dma_addr_t*)pap); +#endif + return va; } void @@ -985,7 +1039,11 @@ osl_dma_free_consistent(osl_t *osh, void *va, uint size, ulong pa) { ASSERT((osh && (osh->magic == OS_HANDLE_MAGIC))); +#ifdef __ARM_ARCH_7A__ + kfree(va); +#else pci_free_consistent(osh->pdev, size, va, (dma_addr_t)pa); +#endif } uint BCMFASTPATH @@ -999,21 +1057,20 @@ osl_dma_map(osl_t *osh, void *va, uint size, int direction, void *p, hnddma_seg_ #if defined(__ARM_ARCH_7A__) && defined(BCMDMASGLISTOSL) if (dmah != NULL) { int32 nsegs, i, totsegs = 0, totlen = 0; - struct scatterlist *sg, _sg[16]; + struct scatterlist *sg, _sg[MAX_DMA_SEGS * 2]; struct sk_buff *skb; for (skb = (struct sk_buff *)p; skb != NULL; skb = PKTNEXT(osh, skb)) { sg = &_sg[totsegs]; if (skb_is_nonlinear(skb)) { nsegs = skb_to_sgvec(skb, sg, 0, PKTLEN(osh, skb)); - ASSERT((nsegs > 0) && (nsegs <= 16)); + ASSERT((nsegs > 0) && (totsegs + nsegs <= MAX_DMA_SEGS)); pci_map_sg(osh->pdev, sg, nsegs, dir); } else { nsegs = 1; + ASSERT(totsegs + nsegs <= MAX_DMA_SEGS); sg->page_link = 0; sg_set_buf(sg, PKTDATA(osh, skb), PKTLEN(osh, skb)); - - pci_map_single(osh->pdev, PKTDATA(osh, skb), - PKTISCTF(osh, skb) ? CTFMAPSZ : PKTLEN(osh, skb), dir); + pci_map_single(osh->pdev, PKTDATA(osh, skb), PKTLEN(osh, skb), dir); } totsegs += nsegs; totlen += PKTLEN(osh, skb); @@ -1026,7 +1083,7 @@ osl_dma_map(osl_t *osh, void *va, uint size, int direction, void *p, hnddma_seg_ } return dmah->segs[0].addr; } -#endif +#endif return (pci_map_single(osh->pdev, va, size, dir)); } @@ -1056,10 +1113,11 @@ osl_assert(const char *exp, const char *file, int line) if (!basename) basename = file; +#ifdef BCMASSERT_LOG snprintf(tempbuf, 64, "\"%s\": file \"%s\", line %d\n", exp, basename, line); - printk("%s", tempbuf); +#endif } @@ -1089,7 +1147,6 @@ osl_sleep(uint ms) } - void * osl_pktdup(osl_t *osh, void *skb) { @@ -1100,7 +1157,11 @@ osl_pktdup(osl_t *osh, void *skb) PKTCTFMAP(osh, skb); +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 36) + if ((p = pskb_copy((struct sk_buff *)skb, GFP_ATOMIC)) == NULL) +#else if ((p = skb_clone((struct sk_buff *)skb, GFP_ATOMIC)) == NULL) +#endif return NULL; #ifdef CTFPOOL @@ -1118,9 +1179,11 @@ osl_pktdup(osl_t *osh, void *skb) PKTSETCLINK(p, NULL); - PKTCCLRATTR(p); - + PKTCCLRFLAGS(p); + PKTCSETCNT(p, 1); + PKTCSETLEN(p, PKTLEN(osh, skb)); + if (osh->pub.pkttag) OSL_PKTTAG_CLEAR(p); @@ -1134,6 +1197,7 @@ osl_pktdup(osl_t *osh, void *skb) + uint osl_pktalloced(osl_t *osh) { @@ -1183,11 +1247,11 @@ osl_os_image_size(void *image) int len = 0, curroffset; if (image) { - + curroffset = generic_file_llseek(image, 0, 1); - + len = generic_file_llseek(image, 0, 2); - + generic_file_llseek(image, curroffset, 0); } return len; diff --git a/drivers/net/wireless/bcmdhd/sbutils.c b/drivers/net/wireless/bcmdhd/sbutils.c index 68cfcb27a9c..a118ecb9c65 100644 --- a/drivers/net/wireless/bcmdhd/sbutils.c +++ b/drivers/net/wireless/bcmdhd/sbutils.c @@ -2,7 +2,7 @@ * Misc utility routines for accessing chip-specific features * of the SiliconBackplane-based Broadcom chips. * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -22,7 +22,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: sbutils.c 310902 2012-01-26 19:45:33Z $ + * $Id: sbutils.c 379512 2013-01-17 22:49:08Z $ */ #include @@ -510,10 +510,11 @@ _sb_scan(si_info_t *sii, uint32 sba, void *regs, uint bus, uint32 sbba, uint num uint32 ccrev = sb_corerev(&sii->pub); /* determine numcores - this is the total # cores in the chip */ - if (((ccrev == 4) || (ccrev >= 6))) + if (((ccrev == 4) || (ccrev >= 6))) { + ASSERT(cc); numcores = (R_REG(sii->osh, &cc->chipid) & CID_CC_MASK) >> CID_CC_SHIFT; - else { + } else { /* Older chips */ uint chip = CHIPID(sii->pub.chip); diff --git a/drivers/net/wireless/bcmdhd/siutils.c b/drivers/net/wireless/bcmdhd/siutils.c index 6f539bbd265..198a49ab41e 100644 --- a/drivers/net/wireless/bcmdhd/siutils.c +++ b/drivers/net/wireless/bcmdhd/siutils.c @@ -2,7 +2,7 @@ * Misc utility routines for accessing chip-specific features * of the SiliconBackplane-based Broadcom chips. * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -22,7 +22,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: siutils.c 369572 2012-11-19 12:57:59Z $ + * $Id: siutils.c 444038 2013-12-18 09:35:07Z $ */ #include @@ -48,6 +48,7 @@ #include #endif /* BCMSPI */ + #include "siutils_priv.h" /* local prototypes */ @@ -108,15 +109,11 @@ si_kattach(osl_t *osh) { static bool ksii_attached = FALSE; - if (!osh) { - SI_ERROR(("%s: osh is NULL\n", __FUNCTION__)); - return NULL; - } - if (!ksii_attached) { void *regs = NULL; regs = REG_MAP(SI_ENUM_BASE, SI_CORE_SIZE); + ASSERT(osh); if (si_doattach(&ksii, BCM4710_DEVICE_ID, osh, regs, SI_BUS, NULL, osh != SI_OSH ? &ksii.vars : NULL, @@ -343,7 +340,7 @@ si_doattach(si_info_t *sii, uint devid, osl_t *osh, void *regs, char *pvars = NULL; uint origidx; #if !defined(_CFEZ_) || defined(CFG_WL) -#endif +#endif ASSERT(GOODREGS(regs)); bzero((uchar*)sii, sizeof(si_info_t)); @@ -396,6 +393,7 @@ si_doattach(si_info_t *sii, uint devid, osl_t *osh, void *regs, return NULL; } w = R_REG(osh, &cc->chipid); + if ((w & 0xfffff) == 148277) w -= 65532; sih->socitype = (w & CID_TYPE_MASK) >> CID_TYPE_SHIFT; /* Might as wll fill in chip id rev & pkg */ sih->chip = w & CID_ID_MASK; @@ -469,7 +467,7 @@ si_doattach(si_info_t *sii, uint devid, osl_t *osh, void *regs, if (bustype == PCI_BUS) { } -#endif +#endif pvars = NULL; BCM_REFERENCE(pvars); @@ -612,6 +610,17 @@ si_flag(si_t *sih) } } +uint +si_flag_alt(si_t *sih) +{ + if ((CHIPTYPE(sih->socitype) == SOCI_AI) || (CHIPTYPE(sih->socitype) == SOCI_NAI)) + return ai_flag_alt(sih); + else { + ASSERT(0); + return 0; + } +} + void si_setint(si_t *sih, int siflag) { @@ -739,6 +748,18 @@ si_corelist(si_t *sih, uint coreid[]) return (sii->numcores); } +/* return current wrapper mapping */ +void * +si_wrapperregs(si_t *sih) +{ + si_info_t *sii; + + sii = SI_INFO(sih); + ASSERT(GOODREGS(sii->curwrap)); + + return (sii->curwrap); +} + /* return current register mapping */ void * si_coreregs(si_t *sih) @@ -1117,6 +1138,7 @@ si_clock_rate(uint32 pll_type, uint32 n, uint32 m) } + /* set chip watchdog reset timer to fire in 'ticks' */ void si_watchdog(si_t *sih, uint ticks) @@ -1133,7 +1155,7 @@ si_watchdog(si_t *sih, uint ticks) si_core_disable(sih, 1); si_setcore(sih, CC_CORE_ID, 0); } -#endif +#endif nb = (sih->ccrev < 26) ? 16 : ((sih->ccrev >= 37) ? 32 : 24); /* The mips compiler uses the sllv instruction, @@ -1196,6 +1218,7 @@ si_slowclk_src(si_info_t *sii) return (SCC_SS_XTAL); } else if (sii->pub.ccrev < 10) { cc = (chipcregs_t *)si_setcoreidx(&sii->pub, sii->curidx); + ASSERT(cc); return (R_REG(sii->osh, &cc->slow_clk_ctl) & SCC_SS_MASK); } else /* Insta-clock */ return (SCC_SS_XTAL); @@ -2281,7 +2304,7 @@ si_chipcontrl_epa4331_wowl(si_t *sih, bool enter_wowl) } si_setcoreidx(sih, origidx); } -#endif +#endif uint si_pll_reset(si_t *sih) @@ -2413,6 +2436,7 @@ si_is_sprom_available(si_t *sih) sii = SI_INFO(sih); origidx = sii->curidx; cc = si_setcoreidx(sih, SI_CC_IDX); + ASSERT(cc); sromctrl = R_REG(sii->osh, &cc->sromcontrol); si_setcoreidx(sih, origidx); return (sromctrl & SRC_PRESENT); diff --git a/drivers/net/wireless/bcmdhd/siutils_priv.h b/drivers/net/wireless/bcmdhd/siutils_priv.h index 1ae06ba6dfb..0d6442919eb 100644 --- a/drivers/net/wireless/bcmdhd/siutils_priv.h +++ b/drivers/net/wireless/bcmdhd/siutils_priv.h @@ -1,7 +1,7 @@ /* * Include file private to the SOC Interconnect support files. * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -21,7 +21,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: siutils_priv.h 348394 2012-08-01 18:38:50Z $ + * $Id: siutils_priv.h 385510 2013-02-15 21:02:07Z $ */ #ifndef _siutils_priv_h_ @@ -204,6 +204,7 @@ extern si_t *ai_kattach(osl_t *osh); extern void ai_scan(si_t *sih, void *regs, uint devid); extern uint ai_flag(si_t *sih); +extern uint ai_flag_alt(si_t *sih); extern void ai_setint(si_t *sih, int siflag); extern uint ai_coreidx(si_t *sih); extern uint ai_corevendor(si_t *sih); diff --git a/drivers/net/wireless/bcmdhd/uamp_api.h b/drivers/net/wireless/bcmdhd/uamp_api.h index 673dce08aad..31e0d4b020a 100644 --- a/drivers/net/wireless/bcmdhd/uamp_api.h +++ b/drivers/net/wireless/bcmdhd/uamp_api.h @@ -3,7 +3,7 @@ * * Description: Universal AMP API * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd/wl_android.c b/drivers/net/wireless/bcmdhd/wl_android.c index e14a4ea7d4f..d2cb3a402e3 100644 --- a/drivers/net/wireless/bcmdhd/wl_android.c +++ b/drivers/net/wireless/bcmdhd/wl_android.c @@ -1,7 +1,7 @@ /* * Linux cfg80211 driver - Android related functions * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -21,11 +21,13 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: wl_android.c 417978 2013-08-13 11:14:05Z $ + * $Id: wl_android.c 442435 2013-12-11 09:03:27Z $ */ #include #include +#include +#include #include #include @@ -35,6 +37,12 @@ #include #include #include +#ifdef WLAIBSS +#include +#endif /* WLAIBSS */ +#ifdef PNO_SUPPORT +#include +#endif #include #ifdef WL_CFG80211 #include @@ -59,10 +67,12 @@ #define CMD_SCAN_PASSIVE "SCAN-PASSIVE" #define CMD_RSSI "RSSI" #define CMD_LINKSPEED "LINKSPEED" +#ifdef PKT_FILTER_SUPPORT #define CMD_RXFILTER_START "RXFILTER-START" #define CMD_RXFILTER_STOP "RXFILTER-STOP" #define CMD_RXFILTER_ADD "RXFILTER-ADD" #define CMD_RXFILTER_REMOVE "RXFILTER-REMOVE" +#endif /* PKT_FILTER_SUPPORT */ #define CMD_BTCOEXSCAN_START "BTCOEXSCAN-START" #define CMD_BTCOEXSCAN_STOP "BTCOEXSCAN-STOP" #define CMD_BTCOEXMODE "BTCOEXMODE" @@ -76,17 +86,23 @@ #define CMD_P2P_SET_NOA "P2P_SET_NOA" #if !defined WL_ENABLE_P2P_IF #define CMD_P2P_GET_NOA "P2P_GET_NOA" -#endif +#endif /* WL_ENABLE_P2P_IF */ #define CMD_P2P_SD_OFFLOAD "P2P_SD_" #define CMD_P2P_SET_PS "P2P_SET_PS" #define CMD_SET_AP_WPS_P2P_IE "SET_AP_WPS_P2P_IE" -#define CMD_SETROAMMODE "SETROAMMODE" +#define CMD_SETROAMMODE "SETROAMMODE" #define CMD_SETIBSSBEACONOUIDATA "SETIBSSBEACONOUIDATA" +#define CMD_MIRACAST "MIRACAST" + +#if defined(WL_SUPPORT_AUTO_CHANNEL) +#define CMD_GET_BEST_CHANNELS "GET_BEST_CHANNELS" +#endif /* WL_SUPPORT_AUTO_CHANNEL */ + #ifdef CUSTOMER_HW4 -#ifdef SUPPORT_AUTO_CHANNEL +#ifdef WL_SUPPORT_AUTO_CHANNEL #define CMD_SET_HAPD_AUTO_CHANNEL "HAPD_AUTO_CHANNEL" -#endif /* SUPPORT_AUTO_CHANNEL */ +#endif /* WL_SUPPORT_AUTO_CHANNEL */ #ifdef SUPPORT_HIDDEN_AP /* Hostapd private command */ #define CMD_SET_HAPD_MAX_NUM_STA "HAPD_MAX_NUM_STA" @@ -105,6 +121,9 @@ #ifdef SUPPORT_LTECX #define CMD_LTECX_SET "LTECOEX" #endif /* SUPPORT_LTECX */ +#ifdef WLFBT +#define CMD_GET_FTKEY "GET_FTKEY" +#endif /* WLFBT */ #endif /* CUSTOMER_HW4 */ /* CCX Private Commands */ @@ -119,27 +138,25 @@ #define CMD_PNOSETUP_SET "PNOSETUP " #define CMD_PNOENABLE_SET "PNOFORCE" #define CMD_PNODEBUG_SET "PNODEBUG" - -#define PNO_TLV_PREFIX 'S' -#define PNO_TLV_VERSION '1' -#define PNO_TLV_SUBVERSION '2' -#define PNO_TLV_RESERVED '0' -#define PNO_TLV_TYPE_SSID_IE 'S' -#define PNO_TLV_TYPE_TIME 'T' -#define PNO_TLV_FREQ_REPEAT 'R' -#define PNO_TLV_FREQ_EXPO_MAX 'M' - -typedef struct cmd_tlv { - char prefix; - char version; - char subver; - char reserved; -} cmd_tlv_t; +#define CMD_WLS_BATCHING "WLS_BATCHING" #endif /* PNO_SUPPORT */ #define CMD_OKC_SET_PMK "SET_PMK" #define CMD_OKC_ENABLE "OKC_ENABLE" +#define CMD_HAPD_MAC_FILTER "HAPD_MAC_FILTER" +/* hostap mac mode */ +#define MACLIST_MODE_DISABLED 0 +#define MACLIST_MODE_DENY 1 +#define MACLIST_MODE_ALLOW 2 + +/* max number of assoc list */ +#define MAX_NUM_OF_ASSOCLIST 64 + +/* max number of mac filter list + * restrict max number to 10 as maximum cmd string size is 255 + */ +#define MAX_NUM_MAC_FILT 10 #ifdef CUSTOMER_HW4 @@ -205,9 +222,59 @@ typedef struct android_wifi_af_params { #define CMD_AMPDU_MPDU "AMPDU_MPDU" #endif /* SUPPORT_AMPDU_MPDU_CMD */ -#define CMD_CHANGE_RL "CHANGE_RL" +#define CMD_CHANGE_RL "CHANGE_RL" #define CMD_RESTORE_RL "RESTORE_RL" + +#ifdef BCMCCX_S69 +/* CISCO S69 commands */ +#define CMD_CCX_S69_ENABLE "CCX_S69_ENABLE" +#define CMD_CCX_S69_REQUEST "CCX_S69_REQUEST" +#endif + +#define CMD_SET_RMC_ENABLE "SETRMCENABLE" +#define CMD_SET_RMC_TXRATE "SETRMCTXRATE" +#define CMD_SET_RMC_ACTPERIOD "SETRMCACTIONPERIOD" +#define CMD_SET_RMC_IDLEPERIOD "SETRMCIDLEPERIOD" + #endif /* CUSTOMER_HW4 */ + +#ifdef WLAIBSS +#define CMD_SETIBSSTXFAILEVENT "SETIBSSTXFAILEVENT" +#define CMD_GET_IBSS_PEER_INFO "GETIBSSPEERINFO" +#define CMD_GET_IBSS_PEER_INFO_ALL "GETIBSSPEERINFOALL" +#define CMD_SETIBSSROUTETABLE "SETIBSSROUTETABLE" +#endif /* WLAIBSS */ + + +/* miracast related definition */ +#define MIRACAST_MODE_OFF 0 +#define MIRACAST_MODE_SOURCE 1 +#define MIRACAST_MODE_SINK 2 + +#ifndef MIRACAST_AMPDU_SIZE +#define MIRACAST_AMPDU_SIZE 8 +#endif + +#ifndef MIRACAST_MCHAN_ALGO +#define MIRACAST_MCHAN_ALGO 1 +#endif + +#ifndef MIRACAST_MCHAN_BW +#define MIRACAST_MCHAN_BW 25 +#endif + +static LIST_HEAD(miracast_resume_list); +static u8 miracast_cur_mode; + +struct io_cfg { + s8 *iovar; + s32 param; + u32 ioctl; + void *arg; + u32 len; + struct list_head list; +}; + typedef struct android_wifi_priv_cmd { char *buf; int used_len; @@ -279,11 +346,9 @@ int wl_cfg80211_set_p2p_ps(struct net_device *net, char* buf, int len) { return 0; } #endif /* WK_CFG80211 */ extern int dhd_os_check_if_up(void *dhdp); +#ifdef BCMLXSDMMC extern void *bcmsdh_get_drvdata(void); -#if defined(PROP_TXSTATUS) && !defined(PROP_TXSTATUS_VSDB) -extern int dhd_wlfc_init(dhd_pub_t *dhd); -extern void dhd_wlfc_deinit(dhd_pub_t *dhd); -#endif +#endif /* BCMLXSDMMC */ #if defined(CUSTOMER_HW4) && defined(WES_SUPPORT) /* wl_roam.c */ @@ -581,7 +646,7 @@ int wl_android_set_country_rev( DHD_ERROR(("%s: set country '%s/%d' failed code %d\n", __FUNCTION__, cspec.ccode, cspec.rev, error)); } else { - dhd_bus_country_set(dev, &cspec); + dhd_bus_country_set(dev, &cspec, true); DHD_INFO(("%s: set country '%s/%d'\n", __FUNCTION__, cspec.ccode, cspec.rev)); } @@ -1064,7 +1129,116 @@ int wl_android_set_okc_mode(struct net_device *dev, char *command, int total_len #endif /* WES_SUPPORT */ #endif /* CUSTOMER_HW4 */ -#if defined(PNO_SUPPORT) && !defined(WL_SCHED_SCAN) +#ifdef PNO_SUPPORT +#define PNO_PARAM_SIZE 50 +#define VALUE_SIZE 50 +static int +wls_parse_batching_cmd(struct net_device *dev, char *command, int total_len) +{ + int err = BCME_OK; + uint i, tokens; + char *pos, *pos2, *token, *token2, *delim; + char param[PNO_PARAM_SIZE], value[VALUE_SIZE]; + struct dhd_pno_batch_params batch_params; + DHD_PNO(("%s: command=%s, len=%d\n", __FUNCTION__, command, total_len)); + if (total_len < strlen(CMD_WLS_BATCHING)) { + DHD_ERROR(("%s argument=%d less min size\n", __FUNCTION__, total_len)); + err = BCME_ERROR; + goto exit; + } + pos = command + strlen(CMD_WLS_BATCHING) + 1; + memset(&batch_params, 0, sizeof(struct dhd_pno_batch_params)); + + if (!strncmp(pos, PNO_BATCHING_SET, strlen(PNO_BATCHING_SET))) { + pos += strlen(PNO_BATCHING_SET) + 1; + while ((token = strsep(&pos, PNO_PARAMS_DELIMETER)) != NULL) { + memset(param, 0, sizeof(param)); + memset(value, 0, sizeof(value)); + if (token == NULL || !*token) + break; + if (*token == '\0') + continue; + delim = strchr(token, PNO_PARAM_VALUE_DELLIMETER); + if (delim != NULL) + *delim = ' '; + + tokens = sscanf(token, "%s %s", param, value); + if (!strncmp(param, PNO_PARAM_SCANFREQ, strlen(PNO_PARAM_MSCAN))) { + batch_params.scan_fr = simple_strtol(value, NULL, 0); + DHD_PNO(("scan_freq : %d\n", batch_params.scan_fr)); + } else if (!strncmp(param, PNO_PARAM_BESTN, strlen(PNO_PARAM_MSCAN))) { + batch_params.bestn = simple_strtol(value, NULL, 0); + DHD_PNO(("bestn : %d\n", batch_params.bestn)); + } else if (!strncmp(param, PNO_PARAM_MSCAN, strlen(PNO_PARAM_MSCAN))) { + batch_params.mscan = simple_strtol(value, NULL, 0); + DHD_PNO(("mscan : %d\n", batch_params.mscan)); + } else if (!strncmp(param, PNO_PARAM_CHANNEL, strlen(PNO_PARAM_MSCAN))) { + i = 0; + pos2 = value; + tokens = sscanf(value, "<%s>", value); + if (tokens != 1) { + err = BCME_ERROR; + DHD_ERROR(("%s : invalid format for channel" + " <> params\n", __FUNCTION__)); + goto exit; + } + while ((token2 = strsep(&pos2, + PNO_PARAM_CHANNEL_DELIMETER)) != NULL) { + if (token2 == NULL || !*token2) + break; + if (*token2 == '\0') + continue; + if (*token2 == 'A' || *token2 == 'B') { + batch_params.band = (*token2 == 'A')? + WLC_BAND_5G : WLC_BAND_2G; + DHD_PNO(("band : %s\n", + (*token2 == 'A')? "A" : "B")); + } else { + batch_params.chan_list[i++] = + simple_strtol(token2, NULL, 0); + batch_params.nchan++; + DHD_PNO(("channel :%d\n", + batch_params.chan_list[i-1])); + } + } + } else if (!strncmp(param, PNO_PARAM_RTT, strlen(PNO_PARAM_MSCAN))) { + batch_params.rtt = simple_strtol(value, NULL, 0); + DHD_PNO(("rtt : %d\n", batch_params.rtt)); + } else { + DHD_ERROR(("%s : unknown param: %s\n", __FUNCTION__, param)); + err = BCME_ERROR; + goto exit; + } + } + err = dhd_dev_pno_set_for_batch(dev, &batch_params); + if (err < 0) { + DHD_ERROR(("failed to configure batch scan\n")); + } else { + memset(command, 0, total_len); + err = sprintf(command, "%d", err); + } + } else if (!strncmp(pos, PNO_BATCHING_GET, strlen(PNO_BATCHING_GET))) { + err = dhd_dev_pno_get_for_batch(dev, command, total_len); + if (err < 0) { + DHD_ERROR(("failed to getting batching results\n")); + } + } else if (!strncmp(pos, PNO_BATCHING_STOP, strlen(PNO_BATCHING_STOP))) { + err = dhd_dev_pno_stop_for_batch(dev); + if (err < 0) { + DHD_ERROR(("failed to stop batching scan\n")); + } else { + memset(command, 0, total_len); + err = sprintf(command, "OK"); + } + } else { + DHD_ERROR(("%s : unknown command\n", __FUNCTION__)); + err = BCME_ERROR; + goto exit; + } +exit: + return err; +} +#ifndef WL_SCHED_SCAN static int wl_android_set_pno_setup(struct net_device *dev, char *command, int total_len) { wlc_ssid_t ssids_local[MAX_PFN_LIST_COUNT]; @@ -1097,23 +1271,16 @@ static int wl_android_set_pno_setup(struct net_device *dev, char *command, int t 0x00 }; #endif /* PNO_SET_DEBUG */ - - DHD_INFO(("%s: command=%s, len=%d\n", __FUNCTION__, command, total_len)); + DHD_PNO(("%s: command=%s, len=%d\n", __FUNCTION__, command, total_len)); if (total_len < (strlen(CMD_PNOSETUP_SET) + sizeof(cmd_tlv_t))) { DHD_ERROR(("%s argument=%d less min size\n", __FUNCTION__, total_len)); goto exit_proc; } - - #ifdef PNO_SET_DEBUG memcpy(command, pno_in_example, sizeof(pno_in_example)); - for (i = 0; i < sizeof(pno_in_example); i++) - printf("%02X ", command[i]); - printf("\n"); total_len = sizeof(pno_in_example); #endif - str_ptr = command + strlen(CMD_PNOSETUP_SET); tlv_size_left = total_len - strlen(CMD_PNOSETUP_SET); @@ -1122,7 +1289,7 @@ static int wl_android_set_pno_setup(struct net_device *dev, char *command, int t if ((cmd_tlv_temp->prefix == PNO_TLV_PREFIX) && (cmd_tlv_temp->version == PNO_TLV_VERSION) && - (cmd_tlv_temp->subver == PNO_TLV_SUBVERSION)) { + (cmd_tlv_temp->subtype == PNO_TLV_SUBTYPE_LEGACY_PNO)) { str_ptr += sizeof(cmd_tlv_t); tlv_size_left -= sizeof(cmd_tlv_t); @@ -1139,7 +1306,7 @@ static int wl_android_set_pno_setup(struct net_device *dev, char *command, int t } str_ptr++; pno_time = simple_strtoul(str_ptr, &str_ptr, 16); - DHD_INFO(("%s: pno_time=%d\n", __FUNCTION__, pno_time)); + DHD_PNO(("%s: pno_time=%d\n", __FUNCTION__, pno_time)); if (str_ptr[0] != 0) { if ((str_ptr[0] != PNO_TLV_FREQ_REPEAT)) { @@ -1149,7 +1316,7 @@ static int wl_android_set_pno_setup(struct net_device *dev, char *command, int t } str_ptr++; pno_repeat = simple_strtoul(str_ptr, &str_ptr, 16); - DHD_INFO(("%s :got pno_repeat=%d\n", __FUNCTION__, pno_repeat)); + DHD_PNO(("%s :got pno_repeat=%d\n", __FUNCTION__, pno_repeat)); if (str_ptr[0] != PNO_TLV_FREQ_EXPO_MAX) { DHD_ERROR(("%s FREQ_EXPO_MAX corrupted field size\n", __FUNCTION__)); @@ -1157,7 +1324,7 @@ static int wl_android_set_pno_setup(struct net_device *dev, char *command, int t } str_ptr++; pno_freq_expo_max = simple_strtoul(str_ptr, &str_ptr, 16); - DHD_INFO(("%s: pno_freq_expo_max=%d\n", + DHD_PNO(("%s: pno_freq_expo_max=%d\n", __FUNCTION__, pno_freq_expo_max)); } } @@ -1166,12 +1333,13 @@ static int wl_android_set_pno_setup(struct net_device *dev, char *command, int t goto exit_proc; } - res = dhd_dev_pno_set(dev, ssids_local, nssid, pno_time, pno_repeat, pno_freq_expo_max); - + res = dhd_dev_pno_set_for_ssid(dev, ssids_local, nssid, pno_time, pno_repeat, + pno_freq_expo_max, NULL, 0); exit_proc: return res; } -#endif /* PNO_SUPPORT && !WL_SCHED_SCAN */ +#endif /* !WL_SCHED_SCAN */ +#endif /* PNO_SUPPORT */ static int wl_android_get_p2p_dev_addr(struct net_device *ndev, char *command, int total_len) { @@ -1269,6 +1437,131 @@ static int wl_android_get_assoc_res_ies(struct net_device *dev, char *command) #endif /* BCMCCX */ +static int +wl_android_set_ap_mac_list(struct net_device *dev, int macmode, struct maclist *maclist) +{ + int i, j, match; + int ret = 0; + char mac_buf[MAX_NUM_OF_ASSOCLIST * + sizeof(struct ether_addr) + sizeof(uint)] = {0}; + struct maclist *assoc_maclist = (struct maclist *)mac_buf; + + /* set filtering mode */ + if ((ret = wldev_ioctl(dev, WLC_SET_MACMODE, &macmode, sizeof(macmode), true)) != 0) { + DHD_ERROR(("%s : WLC_SET_MACMODE error=%d\n", __FUNCTION__, ret)); + return ret; + } + if (macmode != MACLIST_MODE_DISABLED) { + /* set the MAC filter list */ + if ((ret = wldev_ioctl(dev, WLC_SET_MACLIST, maclist, + sizeof(int) + sizeof(struct ether_addr) * maclist->count, true)) != 0) { + DHD_ERROR(("%s : WLC_SET_MACLIST error=%d\n", __FUNCTION__, ret)); + return ret; + } + /* get the current list of associated STAs */ + assoc_maclist->count = MAX_NUM_OF_ASSOCLIST; + if ((ret = wldev_ioctl(dev, WLC_GET_ASSOCLIST, assoc_maclist, + sizeof(mac_buf), false)) != 0) { + DHD_ERROR(("%s : WLC_GET_ASSOCLIST error=%d\n", __FUNCTION__, ret)); + return ret; + } + /* do we have any STA associated? */ + if (assoc_maclist->count) { + /* iterate each associated STA */ + for (i = 0; i < assoc_maclist->count; i++) { + match = 0; + /* compare with each entry */ + for (j = 0; j < maclist->count; j++) { + DHD_INFO(("%s : associated="MACDBG " list="MACDBG "\n", + __FUNCTION__, MAC2STRDBG(assoc_maclist->ea[i].octet), + MAC2STRDBG(maclist->ea[j].octet))); + if (memcmp(assoc_maclist->ea[i].octet, + maclist->ea[j].octet, ETHER_ADDR_LEN) == 0) { + match = 1; + break; + } + } + /* do conditional deauth */ + /* "if not in the allow list" or "if in the deny list" */ + if ((macmode == MACLIST_MODE_ALLOW && !match) || + (macmode == MACLIST_MODE_DENY && match)) { + scb_val_t scbval; + + scbval.val = htod32(1); + memcpy(&scbval.ea, &assoc_maclist->ea[i], + ETHER_ADDR_LEN); + if ((ret = wldev_ioctl(dev, + WLC_SCB_DEAUTHENTICATE_FOR_REASON, + &scbval, sizeof(scb_val_t), true)) != 0) + DHD_ERROR(("%s WLC_SCB_DEAUTHENTICATE error=%d\n", + __FUNCTION__, ret)); + } + } + } + } + return ret; +} + +/* + * HAPD_MAC_FILTER mac_mode mac_cnt mac_addr1 mac_addr2 + * + */ +static int +wl_android_set_mac_address_filter(struct net_device *dev, const char* str) +{ + int i; + int ret = 0; + int macnum = 0; + int macmode = MACLIST_MODE_DISABLED; + struct maclist *list; + char eabuf[ETHER_ADDR_STR_LEN]; + + /* string should look like below (macmode/macnum/maclist) */ + /* 1 2 00:11:22:33:44:55 00:11:22:33:44:ff */ + + /* get the MAC filter mode */ + macmode = bcm_atoi(strsep((char**)&str, " ")); + + if (macmode < MACLIST_MODE_DISABLED || macmode > MACLIST_MODE_ALLOW) { + DHD_ERROR(("%s : invalid macmode %d\n", __FUNCTION__, macmode)); + return -1; + } + + macnum = bcm_atoi(strsep((char**)&str, " ")); + if (macnum < 0 || macnum > MAX_NUM_MAC_FILT) { + DHD_ERROR(("%s : invalid number of MAC address entries %d\n", + __FUNCTION__, macnum)); + return -1; + } + /* allocate memory for the MAC list */ + list = (struct maclist*)kmalloc(sizeof(int) + + sizeof(struct ether_addr) * macnum, GFP_KERNEL); + if (!list) { + DHD_ERROR(("%s : failed to allocate memory\n", __FUNCTION__)); + return -1; + } + /* prepare the MAC list */ + list->count = htod32(macnum); + bzero((char *)eabuf, ETHER_ADDR_STR_LEN); + for (i = 0; i < list->count; i++) { + strncpy(eabuf, strsep((char**)&str, " "), ETHER_ADDR_STR_LEN - 1); + if (!(ret = bcm_ether_atoe(eabuf, &list->ea[i]))) { + DHD_ERROR(("%s : mac parsing err index=%d, addr=%s\n", + __FUNCTION__, i, eabuf)); + list->count--; + break; + } + DHD_INFO(("%s : %d/%d MACADDR=%s", __FUNCTION__, i, list->count, eabuf)); + } + /* set the list */ + if ((ret = wl_android_set_ap_mac_list(dev, macmode, list)) != 0) + DHD_ERROR(("%s : Setting MAC list failed error=%d\n", __FUNCTION__, ret)); + + kfree(list); + + return 0; +} + /** * Global function definitions (declared in wl_android.h) */ @@ -1305,9 +1598,6 @@ int wl_android_wifi_on(struct net_device *dev) if (dhd_dev_init_ioctl(dev) < 0) ret = -EFAULT; } -#if defined(PROP_TXSTATUS) && !defined(PROP_TXSTATUS_VSDB) - dhd_wlfc_init(bcmsdh_get_drvdata()); -#endif g_wifi_on = TRUE; } @@ -1329,9 +1619,6 @@ int wl_android_wifi_off(struct net_device *dev) dhd_net_if_lock(dev); if (g_wifi_on) { -#if defined(PROP_TXSTATUS) && !defined(PROP_TXSTATUS_VSDB) - dhd_wlfc_deinit(bcmsdh_get_drvdata()); -#endif ret = dhd_dev_reset(dev, TRUE); sdioh_stop(NULL); dhd_customer_gpio_wlan_ctrl(WLAN_RESET_OFF); @@ -1431,13 +1718,8 @@ wl_android_set_ampdu_mpdu(struct net_device *dev, const char* string_num) } #endif /* SUPPORT_AMPDU_MPDU_CMD */ -#define CH20MHZ_LCHSPEC(channel) \ - (chanspec_t)((chanspec_t)(channel) | WL_LCHANSPEC_BW_20 | \ - WL_LCHANSPEC_CTL_SB_NONE | (((channel) <= CH_MAX_2G_CHANNEL) ? \ - WL_LCHANSPEC_BAND_2G : WL_LCHANSPEC_BAND_5G)) - /* SoftAP feature */ -#ifdef SUPPORT_AUTO_CHANNEL +#if defined(WL_SUPPORT_AUTO_CHANNEL) static int wl_android_set_auto_channel(struct net_device *dev, const char* string_num, char* command, int total_len) @@ -1482,8 +1764,8 @@ wl_android_set_auto_channel(struct net_device *dev, const char* string_num, retry = 10; while (retry--) { - ret = wldev_ioctl(dev, WLC_GET_CHANNEL_SEL, &chosen, sizeof(chosen), - false); + ret = wldev_ioctl(dev, WLC_GET_CHANNEL_SEL, &chosen, + sizeof(chosen), false); if (ret < 0 || dtoh32(chosen) == 0) { DHD_INFO(("%s: %d tried, ret = %d, chosen = %d\n", __FUNCTION__, (10 - retry), ret, chosen)); @@ -1513,7 +1795,7 @@ wl_android_set_auto_channel(struct net_device *dev, const char* string_num, return 4; } -#endif /* SUPPORT_AUTO_CHANNEL */ +#endif /* WL_SUPPORT_AUTO_CHANNEL */ #ifdef SUPPORT_HIDDEN_AP static int @@ -1674,6 +1956,28 @@ wl_android_set_ltecx(struct net_device *dev, const char* string_num) return 1; } #endif /* SUPPORT_LTECX */ + +static int +wl_android_rmc_enable(struct net_device *net, int rmc_enable) +{ + int err; + char smbuf[WLC_IOCTL_SMLEN]; + + err = wldev_iovar_setint(net, "rmc_ackreq", rmc_enable); + if (err) + return err; + + if (rmc_enable) { + wl_relmcast_entry_table_t table; + table.index = 0; + table.opcode = RELMCAST_ENTRY_OP_ACK_ALL; + table.entry[0].flag = RELMCAST_ENTRY_OP_ACK_ALL; + err = wldev_iovar_setbuf(net, "rmc_ackmac", &table, + sizeof(table) + sizeof(wl_relmcast_globalMcTbl_t), + smbuf, sizeof(smbuf), NULL); + } + return err; +} #endif /* CUSTOMER_HW4 */ int wl_android_set_roam_mode(struct net_device *dev, char *command, int total_len) @@ -1775,7 +2079,7 @@ int wl_android_set_ibss_beacon_ouidata(struct net_device *dev, char *command, in if (err != BCME_OK) { err = -EINVAL; if (vndr_ie) { - kfree(vndr_ie); + kfree(vndr_ie); } } else { @@ -1790,6 +2094,456 @@ int wl_android_set_ibss_beacon_ouidata(struct net_device *dev, char *command, in return err; } +static int +wl_android_iolist_add(struct net_device *dev, struct list_head *head, struct io_cfg *config) +{ + struct io_cfg *resume_cfg; + s32 ret; + + resume_cfg = kzalloc(sizeof(struct io_cfg), GFP_KERNEL); + if (!resume_cfg) + return -ENOMEM; + + if (config->iovar) { + ret = wldev_iovar_getint(dev, config->iovar, &resume_cfg->param); + if (ret) { + DHD_ERROR(("%s: Failed to get current %s value\n", + __FUNCTION__, config->iovar)); + goto error; + } + + ret = wldev_iovar_setint(dev, config->iovar, config->param); + if (ret) { + DHD_ERROR(("%s: Failed to set %s to %d\n", __FUNCTION__, + config->iovar, config->param)); + goto error; + } + + resume_cfg->iovar = config->iovar; + } else { + resume_cfg->arg = kzalloc(config->len, GFP_KERNEL); + if (!resume_cfg->arg) { + ret = -ENOMEM; + goto error; + } + ret = wldev_ioctl(dev, config->ioctl, resume_cfg->arg, config->len, false); + if (ret) { + DHD_ERROR(("%s: Failed to get ioctl %d\n", __FUNCTION__, + config->ioctl)); + goto error; + } + ret = wldev_ioctl(dev, config->ioctl + 1, config->arg, config->len, true); + if (ret) { + DHD_ERROR(("%s: Failed to set %s to %d\n", __FUNCTION__, + config->iovar, config->param)); + goto error; + } + if (config->ioctl + 1 == WLC_SET_PM) + wl_cfg80211_update_power_mode(dev); + resume_cfg->ioctl = config->ioctl; + resume_cfg->len = config->len; + } + + list_add(&resume_cfg->list, head); + + return 0; +error: + kfree(resume_cfg->arg); + kfree(resume_cfg); + return ret; +} + +static void +wl_android_iolist_resume(struct net_device *dev, struct list_head *head) +{ + struct io_cfg *config; + struct list_head *cur, *q; + s32 ret = 0; + + list_for_each_safe(cur, q, head) { + config = list_entry(cur, struct io_cfg, list); + if (config->iovar) { + if (!ret) + ret = wldev_iovar_setint(dev, config->iovar, + config->param); + } else { + if (!ret) + ret = wldev_ioctl(dev, config->ioctl + 1, + config->arg, config->len, true); + if (config->ioctl + 1 == WLC_SET_PM) + wl_cfg80211_update_power_mode(dev); + kfree(config->arg); + } + list_del(cur); + kfree(config); + } +} + +static int +wl_android_set_miracast(struct net_device *dev, char *command, int total_len) +{ + int mode, val; + int ret = 0; + struct io_cfg config; + + if (sscanf(command, "%*s %d", &mode) != 1) { + DHD_ERROR(("%s: Failed to get Parameter\n", __FUNCTION__)); + return -1; + } + + DHD_INFO(("%s: enter miracast mode %d\n", __FUNCTION__, mode)); + + if (miracast_cur_mode == mode) + return 0; + + wl_android_iolist_resume(dev, &miracast_resume_list); + miracast_cur_mode = MIRACAST_MODE_OFF; + + switch (mode) { + case MIRACAST_MODE_SOURCE: + /* setting mchan_algo to platform specific value */ + config.iovar = "mchan_algo"; + config.param = MIRACAST_MCHAN_ALGO; + ret = wl_android_iolist_add(dev, &miracast_resume_list, &config); + if (ret) + goto resume; + + /* setting mchan_bw to platform specific value */ + config.iovar = "mchan_bw"; + config.param = MIRACAST_MCHAN_BW; + ret = wl_android_iolist_add(dev, &miracast_resume_list, &config); + if (ret) + goto resume; + + /* setting apmdu to platform specific value */ + config.iovar = "ampdu_mpdu"; + config.param = MIRACAST_AMPDU_SIZE; + ret = wl_android_iolist_add(dev, &miracast_resume_list, &config); + if (ret) + goto resume; + /* FALLTROUGH */ + /* Source mode shares most configurations with sink mode. + * Fall through here to avoid code duplication + */ + case MIRACAST_MODE_SINK: + /* disable internal roaming */ + config.iovar = "roam_off"; + config.param = 1; + ret = wl_android_iolist_add(dev, &miracast_resume_list, &config); + if (ret) + goto resume; + /* tunr off pm */ + val = 0; + config.iovar = NULL; + config.ioctl = WLC_GET_PM; + config.arg = &val; + config.len = sizeof(int); + ret = wl_android_iolist_add(dev, &miracast_resume_list, &config); + if (ret) + goto resume; + + break; + case MIRACAST_MODE_OFF: + default: + break; + } + miracast_cur_mode = mode; + + return 0; + +resume: + DHD_ERROR(("%s: turnoff miracast mode because of err%d\n", __FUNCTION__, ret)); + wl_android_iolist_resume(dev, &miracast_resume_list); + return ret; +} + +#ifdef WLAIBSS +#define NETLINK_OXYGEN 30 +#define AIBSS_BEACON_TIMEOUT 10 + +static struct sock *nl_sk = NULL; + +static void wl_netlink_recv(struct sk_buff *skb) +{ + WL_ERR(("netlink_recv called\n")); +} + +static int wl_netlink_init(void) +{ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0)) + struct netlink_kernel_cfg cfg = { + .input = wl_netlink_recv, + }; +#endif + + if (nl_sk != NULL) { + WL_ERR(("nl_sk already exist\n")); + return BCME_ERROR; + } + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 6, 0)) + nl_sk = netlink_kernel_create(&init_net, NETLINK_OXYGEN, + 0, wl_netlink_recv, NULL, THIS_MODULE); +#elif (LINUX_VERSION_CODE < KERNEL_VERSION(3, 7, 0)) + nl_sk = netlink_kernel_create(&init_net, NETLINK_OXYGEN, THIS_MODULE, &cfg); +#else + nl_sk = netlink_kernel_create(&init_net, NETLINK_OXYGEN, &cfg); +#endif + + if (nl_sk == NULL) { + WL_ERR(("nl_sk is not ready\n")); + return BCME_ERROR; + } + + return BCME_OK; +} + +static void wl_netlink_deinit(void) +{ + if (nl_sk) { + netlink_kernel_release(nl_sk); + nl_sk = NULL; + } +} + +s32 +wl_netlink_send_msg(int pid, int seq, void *data, int size) +{ + struct sk_buff *skb = NULL; + struct nlmsghdr *nlh = NULL; + int ret = -1; + + if (nl_sk == NULL) { + WL_ERR(("nl_sk was not initialized\n")); + goto nlmsg_failure; + } + + skb = alloc_skb(NLMSG_SPACE(size), GFP_ATOMIC); + if (skb == NULL) { + WL_ERR(("failed to allocate memory\n")); + goto nlmsg_failure; + } + + nlh = NLMSG_PUT(skb, 0, 0, 0, size); + memcpy(NLMSG_DATA(nlh), data, size); + nlh->nlmsg_seq = seq; + + /* netlink_unicast() takes ownership of the skb and frees it itself. */ + ret = netlink_unicast(nl_sk, skb, pid, 0); + WL_DBG(("netlink_unicast() pid=%d, ret=%d\n", pid, ret)); + +nlmsg_failure: + return ret; +} + +static int wl_android_set_ibss_txfail_event(struct net_device *dev, char *command, int total_len) +{ + int err = 0; + int retry = 0; + int pid = 0; + aibss_txfail_config_t txfail_config = {0, 0, 0, 0}; + char smbuf[WLC_IOCTL_SMLEN]; + + if (sscanf(command, CMD_SETIBSSTXFAILEVENT " %d %d", &retry, &pid) <= 0) { + WL_ERR(("Failed to get Parameter from : %s\n", command)); + return -1; + } + + /* set pid, and if the event was happened, let's send a notification through netlink */ + wl_cfg80211_set_txfail_pid(pid); + + /* If retry value is 0, it disables the functionality for TX Fail. */ + if (retry > 0) { + txfail_config.max_tx_retry = retry; + txfail_config.bcn_timeout = 0; /* 0 : disable tx fail from beacon */ + } + txfail_config.version = AIBSS_TXFAIL_CONFIG_VER_0; + txfail_config.len = sizeof(txfail_config); + + err = wldev_iovar_setbuf(dev, "aibss_txfail_config", (void *) &txfail_config, + sizeof(aibss_txfail_config_t), smbuf, WLC_IOCTL_SMLEN, NULL); + WL_DBG(("retry=%d, pid=%d, err=%d\n", retry, pid, err)); + + return ((err == 0)?total_len:err); +} + +static int wl_android_get_ibss_peer_info(struct net_device *dev, char *command, + int total_len, bool bAll) +{ + int error; + int bytes_written = 0; + void *buf = NULL; + bss_peer_list_info_t peer_list_info; + bss_peer_info_t *peer_info; + int i; + bool found = false; + struct ether_addr mac_ea; + + WL_DBG(("get ibss peer info(%s)\n", bAll?"true":"false")); + + if (!bAll) { + if (sscanf (command, "GETIBSSPEERINFO %02x:%02x:%02x:%02x:%02x:%02x", + (unsigned int *)&mac_ea.octet[0], (unsigned int *)&mac_ea.octet[1], + (unsigned int *)&mac_ea.octet[2], (unsigned int *)&mac_ea.octet[3], + (unsigned int *)&mac_ea.octet[4], (unsigned int *)&mac_ea.octet[5]) != 6) { + WL_DBG(("invalid MAC address\n")); + return -1; + } + } + + if ((buf = kmalloc(WLC_IOCTL_MAXLEN, GFP_KERNEL)) == NULL) { + WL_ERR(("kmalloc failed\n")); + return -1; + } + + error = wldev_iovar_getbuf(dev, "bss_peer_info", NULL, 0, buf, WLC_IOCTL_MAXLEN, NULL); + if (unlikely(error)) { + WL_ERR(("could not get ibss peer info (%d)\n", error)); + kfree(buf); + return -1; + } + + memcpy(&peer_list_info, buf, sizeof(peer_list_info)); + peer_list_info.version = htod16(peer_list_info.version); + peer_list_info.bss_peer_info_len = htod16(peer_list_info.bss_peer_info_len); + peer_list_info.count = htod32(peer_list_info.count); + + WL_DBG(("ver:%d, len:%d, count:%d\n", peer_list_info.version, + peer_list_info.bss_peer_info_len, peer_list_info.count)); + + if (peer_list_info.count > 0) { + if (bAll) + bytes_written += sprintf(&command[bytes_written], "%u ", + peer_list_info.count); + + peer_info = (bss_peer_info_t *) ((void *)buf + BSS_PEER_LIST_INFO_FIXED_LEN); + + for (i = 0; i < peer_list_info.count; i++) { + + WL_DBG(("index:%d rssi:%d, tx:%u, rx:%u\n", i, peer_info->rssi, + peer_info->tx_rate, peer_info->rx_rate)); + + if (!bAll && + memcmp(&mac_ea, &peer_info->ea, sizeof(struct ether_addr)) == 0) { + found = true; + } + + if (bAll || found) { + bytes_written += sprintf(&command[bytes_written], MACF, + ETHER_TO_MACF(peer_info->ea)); + bytes_written += sprintf(&command[bytes_written], " %u %d ", + peer_info->tx_rate/1000, peer_info->rssi); + } + + if (found) + break; + + peer_info = (bss_peer_info_t *)((void *)peer_info+sizeof(bss_peer_info_t)); + } + } + else { + WL_ERR(("could not get ibss peer info : no item\n")); + } + bytes_written += sprintf(&command[bytes_written], "%s", "\0"); + + WL_DBG(("command(%u):%s\n", total_len, command)); + WL_DBG(("bytes_written:%d\n", bytes_written)); + + kfree(buf); + return bytes_written; +} + +int wl_android_set_ibss_routetable(struct net_device *dev, char *command, int total_len) +{ + + char *pcmd = command; + char *str = NULL; + + ibss_route_tbl_t *route_tbl = NULL; + char *ioctl_buf = NULL; + u16 kflags = in_atomic() ? GFP_ATOMIC : GFP_KERNEL; + s32 err = BCME_OK; + uint32 route_tbl_len; + uint32 entries; + char *endptr; + uint32 i = 0; + struct ipv4_addr dipaddr; + struct ether_addr ea; + + route_tbl_len = sizeof(ibss_route_tbl_t) + + (MAX_IBSS_ROUTE_TBL_ENTRY - 1) * sizeof(ibss_route_entry_t); + route_tbl = (ibss_route_tbl_t *)kzalloc(route_tbl_len, kflags); + if (!route_tbl) { + WL_ERR(("Route TBL alloc failed\n")); + return -ENOMEM; + } + ioctl_buf = kzalloc(WLC_IOCTL_MEDLEN, GFP_KERNEL); + if (!ioctl_buf) { + WL_ERR(("ioctl memory alloc failed\n")); + if (route_tbl) { + kfree(route_tbl); + } + return -ENOMEM; + } + memset(ioctl_buf, 0, WLC_IOCTL_MEDLEN); + + /* drop command */ + str = bcmstrtok(&pcmd, " ", NULL); + + /* get count */ + str = bcmstrtok(&pcmd, " ", NULL); + if (!str) { + WL_ERR(("Invalid number parameter %s\n", str)); + err = -EINVAL; + goto exit; + } + entries = bcm_strtoul(str, &endptr, 0); + if (*endptr != '\0') { + WL_ERR(("Invalid number parameter %s\n", str)); + err = -EINVAL; + goto exit; + } + WL_INFO(("Routing table count:%d\n", entries)); + route_tbl->num_entry = entries; + + for (i = 0; i < entries; i++) { + str = bcmstrtok(&pcmd, " ", NULL); + if (!str || !bcm_atoipv4(str, &dipaddr)) { + WL_ERR(("Invalid ip string %s\n", str)); + err = -EINVAL; + goto exit; + } + + + str = bcmstrtok(&pcmd, " ", NULL); + if (!str || !bcm_ether_atoe(str, &ea)) { + WL_ERR(("Invalid ethernet string %s\n", str)); + err = -EINVAL; + goto exit; + } + bcopy(&dipaddr, &route_tbl->route_entry[i].ipv4_addr, IPV4_ADDR_LEN); + bcopy(&ea, &route_tbl->route_entry[i].nexthop, ETHER_ADDR_LEN); + } + + route_tbl_len = sizeof(ibss_route_tbl_t) + + ((!entries?0:(entries - 1)) * sizeof(ibss_route_entry_t)); + err = wldev_iovar_setbuf(dev, "ibss_route_tbl", + route_tbl, route_tbl_len, ioctl_buf, WLC_IOCTL_MEDLEN, NULL); + if (err != BCME_OK) { + WL_ERR(("Fail to set iovar %d\n", err)); + err = -EINVAL; + } + +exit: + if (route_tbl) + kfree(route_tbl); + if (ioctl_buf) + kfree(ioctl_buf); + return err; + +} +#endif /* WLAIBSS */ + int wl_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd) { #define PRIVATE_COMMAND_MAX_LEN 8192 @@ -1940,7 +2694,7 @@ int wl_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd) /* CUSTOMER_SET_COUNTRY feature is define for only GGSM model */ else if (strnicmp(command, CMD_COUNTRY, strlen(CMD_COUNTRY)) == 0) { char *country_code = command + strlen(CMD_COUNTRY) + 1; - bytes_written = wldev_set_country(net, country_code); + bytes_written = wldev_set_country(net, country_code, true, true); } #endif /* CUSTOMER_SET_COUNTRY */ #endif /* WL_CFG80211 */ @@ -2049,18 +2803,23 @@ int wl_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd) #endif /* WES_SUPPORT */ #endif /* CUSTOMER_HW4 */ -#if defined(PNO_SUPPORT) && !defined(WL_SCHED_SCAN) +#ifdef PNO_SUPPORT else if (strnicmp(command, CMD_PNOSSIDCLR_SET, strlen(CMD_PNOSSIDCLR_SET)) == 0) { - bytes_written = dhd_dev_pno_reset(net); + bytes_written = dhd_dev_pno_stop_for_ssid(net); } +#ifndef WL_SCHED_SCAN else if (strnicmp(command, CMD_PNOSETUP_SET, strlen(CMD_PNOSETUP_SET)) == 0) { bytes_written = wl_android_set_pno_setup(net, command, priv_cmd.total_len); } +#endif /* !WL_SCHED_SCAN */ else if (strnicmp(command, CMD_PNOENABLE_SET, strlen(CMD_PNOENABLE_SET)) == 0) { - uint pfn_enabled = *(command + strlen(CMD_PNOENABLE_SET) + 1) - '0'; - bytes_written = dhd_dev_pno_enable(net, pfn_enabled); + int enable = *(command + strlen(CMD_PNOENABLE_SET) + 1) - '0'; + bytes_written = (enable)? 0 : dhd_dev_pno_stop_for_ssid(net); } -#endif /* PNO_SUPPORT && !WL_SCHED_SCAN */ + else if (strnicmp(command, CMD_WLS_BATCHING, strlen(CMD_WLS_BATCHING)) == 0) { + bytes_written = wls_parse_batching_cmd(net, command, priv_cmd.total_len); + } +#endif /* PNO_SUPPORT */ else if (strnicmp(command, CMD_P2P_DEV_ADDR, strlen(CMD_P2P_DEV_ADDR)) == 0) { bytes_written = wl_android_get_p2p_dev_addr(net, command, priv_cmd.total_len); } @@ -2102,6 +2861,13 @@ int wl_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd) bytes_written = wl_android_get_assoc_res_ies(net, command); } #endif /* BCMCCX */ +#if defined(WL_SUPPORT_AUTO_CHANNEL) + else if (strnicmp(command, CMD_GET_BEST_CHANNELS, + strlen(CMD_GET_BEST_CHANNELS)) == 0) { + bytes_written = wl_cfg80211_get_best_channels(net, command, + priv_cmd.total_len); + } +#endif /* WL_SUPPORT_AUTO_CHANNEL */ #ifdef CUSTOMER_HW4 #ifdef SUPPORT_AMPDU_MPDU_CMD /* CMD_AMPDU_MPDU */ @@ -2110,15 +2876,15 @@ int wl_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd) bytes_written = wl_android_set_ampdu_mpdu(net, (const char*)command+skip); } #endif /* SUPPORT_AMPDU_MPDU_CMD */ -#ifdef SUPPORT_AUTO_CHANNEL +#if defined(WL_SUPPORT_AUTO_CHANNEL) else if (strnicmp(command, CMD_SET_HAPD_AUTO_CHANNEL, strlen(CMD_SET_HAPD_AUTO_CHANNEL)) == 0) { int skip = strlen(CMD_SET_HAPD_AUTO_CHANNEL) + 3; bytes_written = wl_android_set_auto_channel(net, (const char*)command+skip, command, priv_cmd.total_len); } -#endif /* SUPPORT_AUTO_CHANNEL */ -#ifdef SUPPORT_HIDDEN_AP +#endif /* WL_SUPPORT_AUTO_CHANNEL */ +#if defined(SUPPORT_HIDDEN_AP) else if (strnicmp(command, CMD_SET_HAPD_MAX_NUM_STA, strlen(CMD_SET_HAPD_MAX_NUM_STA)) == 0) { int skip = strlen(CMD_SET_HAPD_MAX_NUM_STA) + 3; @@ -2165,13 +2931,73 @@ int wl_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd) bytes_written = wl_android_set_ltecx(net, (const char*)command+skip); } #endif /* SUPPORT_LTECX */ + else if (strnicmp(command, CMD_SET_RMC_ENABLE, strlen(CMD_SET_RMC_ENABLE)) == 0) { + int rmc_enable = *(command + strlen(CMD_SET_RMC_ENABLE) + 1) - '0'; + bytes_written = wl_android_rmc_enable(net, rmc_enable); + } + else if (strnicmp(command, CMD_SET_RMC_TXRATE, strlen(CMD_SET_RMC_TXRATE)) == 0) { + int rmc_txrate; + sscanf(command, "%*s %10d", &rmc_txrate); + bytes_written = wldev_iovar_setint(net, "rmc_txrate", rmc_txrate * 2); + } + else if (strnicmp(command, CMD_SET_RMC_ACTPERIOD, strlen(CMD_SET_RMC_ACTPERIOD)) == 0) { + int actperiod; + sscanf(command, "%*s %10d", &actperiod); + bytes_written = wldev_iovar_setint(net, "rmc_actf_time", actperiod); + } + else if (strnicmp(command, CMD_SET_RMC_IDLEPERIOD, strlen(CMD_SET_RMC_IDLEPERIOD)) == 0) { + int acktimeout; + sscanf(command, "%*s %10d", &acktimeout); + acktimeout *= 1000; + bytes_written = wldev_iovar_setint(net, "rmc_acktmo", acktimeout); + } +#ifdef BCMCCX_S69 + else if (strnicmp(command, CMD_CCX_S69_ENABLE, strlen(CMD_CCX_S69_ENABLE)) == 0) { + uint enable = *(command + strlen(CMD_CCX_S69_ENABLE) + 1) - '0'; + bytes_written = wldev_iovar_setint(net, "ccx_s69_enable", enable); + } + else if (strnicmp(command, CMD_CCX_S69_REQUEST, strlen(CMD_CCX_S69_REQUEST)) == 0) { + int skip = strlen(CMD_CCX_S69_REQUEST) + 1; + uint16 req = (uint16)bcm_strtoul(command + skip, NULL, 16); + bytes_written = wldev_iovar_setint(net, "ccx_s69_req", req); + } +#endif /* BCMCCX_S69 */ +#ifdef WLFBT + else if (strnicmp(command, CMD_GET_FTKEY, strlen(CMD_GET_FTKEY)) == 0) { + wl_get_fbt_key(command); + bytes_written = FBT_KEYLEN; + } +#endif /* WLFBT */ #endif /* CUSTOMER_HW4 */ + else if (strnicmp(command, CMD_HAPD_MAC_FILTER, strlen(CMD_HAPD_MAC_FILTER)) == 0) { + int skip = strlen(CMD_HAPD_MAC_FILTER) + 1; + wl_android_set_mac_address_filter(net, (const char*)command+skip); + } else if (strnicmp(command, CMD_SETROAMMODE, strlen(CMD_SETROAMMODE)) == 0) bytes_written = wl_android_set_roam_mode(net, command, priv_cmd.total_len); + else if (strnicmp(command, CMD_MIRACAST, strlen(CMD_MIRACAST)) == 0) + bytes_written = wl_android_set_miracast(net, command, priv_cmd.total_len); else if (strnicmp(command, CMD_SETIBSSBEACONOUIDATA, strlen(CMD_SETIBSSBEACONOUIDATA)) == 0) bytes_written = wl_android_set_ibss_beacon_ouidata(net, command, priv_cmd.total_len); +#ifdef WLAIBSS + else if (strnicmp(command, CMD_SETIBSSROUTETABLE, + strlen(CMD_SETIBSSROUTETABLE)) == 0) + bytes_written = wl_android_set_ibss_routetable(net, command, + priv_cmd.total_len); + else if (strnicmp(command, CMD_SETIBSSTXFAILEVENT, + strlen(CMD_SETIBSSTXFAILEVENT)) == 0) + bytes_written = wl_android_set_ibss_txfail_event(net, command, priv_cmd.total_len); + else if (strnicmp(command, CMD_GET_IBSS_PEER_INFO_ALL, + strlen(CMD_GET_IBSS_PEER_INFO_ALL)) == 0) + bytes_written = wl_android_get_ibss_peer_info(net, command, priv_cmd.total_len, + TRUE); + else if (strnicmp(command, CMD_GET_IBSS_PEER_INFO, + strlen(CMD_GET_IBSS_PEER_INFO)) == 0) + bytes_written = wl_android_get_ibss_peer_info(net, command, priv_cmd.total_len, + FALSE); +#endif /* WLAIBSS */ else { DHD_ERROR(("Unknown PRIVATE command %s - ignored\n", command)); snprintf(command, 3, "OK"); @@ -2223,6 +3049,9 @@ int wl_android_init(void) #ifdef WL_GENL wl_genl_init(); #endif +#ifdef WLAIBSS + wl_netlink_init(); +#endif /* WLAIBSS */ return ret; } @@ -2234,12 +3063,16 @@ int wl_android_exit(void) #ifdef WL_GENL wl_genl_deinit(); #endif /* WL_GENL */ +#ifdef WLAIBSS + wl_netlink_deinit(); +#endif /* WLAIBSS */ return ret; } void wl_android_post_init(void) { + #ifdef ENABLE_4335BT_WAR bcm_bt_unlock(lock_cookie_wifi); printk("%s: btlock released\n", __FUNCTION__); @@ -2314,6 +3147,11 @@ s32 wl_event_to_bcm_event(u16 event_type) case WLC_E_P2PO_DEL_DEVICE: event = BCM_E_DEV_LOST; break; +#ifdef BCMCCX_S69 + case WLC_E_CCX_S69_RESP_RX: + event = BCM_E_DEV_S69RESP; + break; +#endif /* Above events are supported from BCM Supp ver 47 Onwards */ default: @@ -2472,7 +3310,13 @@ wl_genl_handle_msg( return -EINVAL; } else { /* Handle the data */ - WL_DBG(("Data received from pid (%d) \n", info->snd_pid)); +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 7, 0)) || defined(WL_COMPAT_WIRELESS) + WL_DBG(("%s: Data received from pid (%d) \n", __func__, + info->snd_pid)); +#else + WL_DBG(("%s: Data received from pid (%d) \n", __func__, + info->snd_portid)); +#endif /* (LINUX_VERSION < VERSION(3, 7, 0) || WL_COMPAT_WIRELESS */ } return 0; @@ -2489,6 +3333,7 @@ static int g_wifidev_registered = 0; static struct semaphore wifi_control_sem; static struct wifi_platform_data *wifi_control_data = NULL; static struct resource *wifi_irqres = NULL; +static struct regulator *wifi_regulator = NULL; static int wifi_add_dev(void); static void wifi_del_dev(void); @@ -2557,6 +3402,8 @@ int wifi_set_power(int on, unsigned long msec) { int ret = 0; DHD_ERROR(("%s = %d\n", __FUNCTION__, on)); + if (wifi_regulator && on) + ret = regulator_enable(wifi_regulator); if (wifi_control_data && wifi_control_data->set_power) { #ifdef ENABLE_4335BT_WAR if (on) { @@ -2573,6 +3420,9 @@ int wifi_set_power(int on, unsigned long msec) ret = wifi_control_data->set_power(on); } + if (wifi_regulator && !on) + ret = regulator_disable(wifi_regulator); + if (msec && !ret) OSL_SLEEP(msec); return ret; @@ -2613,18 +3463,48 @@ static int wifi_set_carddetect(int on) return 0; } +static struct resource *get_wifi_irqres_from_of(struct platform_device *pdev) +{ + static struct resource gpio_wifi_irqres; + int irq; + int gpio = of_get_gpio(pdev->dev.of_node, 0); + if (gpio < 0) + return NULL; + irq = gpio_to_irq(gpio); + if (irq < 0) + return NULL; + + gpio_wifi_irqres.name = "bcmdhd_wlan_irq"; + gpio_wifi_irqres.start = irq; + gpio_wifi_irqres.end = irq; + gpio_wifi_irqres.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL | + IORESOURCE_IRQ_SHAREABLE; + + return &gpio_wifi_irqres; +} + static int wifi_probe(struct platform_device *pdev) { int err; + struct regulator *regulator; struct wifi_platform_data *wifi_ctrl = (struct wifi_platform_data *)(pdev->dev.platform_data); + if (!wifi_ctrl) { + regulator = regulator_get(&pdev->dev, "wlreg_on"); + if (IS_ERR(regulator)) + return PTR_ERR(regulator); + wifi_regulator = regulator; + } + wifi_irqres = platform_get_resource_byname(pdev, IORESOURCE_IRQ, "bcmdhd_wlan_irq"); if (wifi_irqres == NULL) wifi_irqres = platform_get_resource_byname(pdev, IORESOURCE_IRQ, "bcm4329_wlan_irq"); + if (wifi_irqres == NULL) + wifi_irqres = get_wifi_irqres_from_of(pdev); wifi_control_data = wifi_ctrl; - err = wifi_set_power(1, 200); /* Power On */ + err = wifi_set_power(1, WIFI_TURNON_DELAY); /* Power On */ if (unlikely(err)) { DHD_ERROR(("%s: set_power failed. err=%d\n", __FUNCTION__, err)); wifi_set_power(0, WIFI_TURNOFF_DELAY); @@ -2642,14 +3522,23 @@ static int wifi_remove(struct platform_device *pdev) { struct wifi_platform_data *wifi_ctrl = (struct wifi_platform_data *)(pdev->dev.platform_data); + struct io_cfg *cur, *q; DHD_ERROR(("## %s\n", __FUNCTION__)); wifi_control_data = wifi_ctrl; if (g_wifi_poweron) { - wifi_set_power(0, WIFI_TURNOFF_DELAY); /* Power Off */ - wifi_set_carddetect(0); /* CardDetect (1->0) */ + wifi_set_power(0, WIFI_TURNOFF_DELAY); /* Power Off */ + wifi_set_carddetect(0); /* CardDetect (1->0) */ g_wifi_poweron = FALSE; + list_for_each_entry_safe(cur, q, &miracast_resume_list, list) { + list_del(&cur->list); + kfree(cur); + } + } + if (wifi_regulator) { + regulator_put(wifi_regulator); + wifi_regulator = NULL; } up(&wifi_control_sem); @@ -2675,6 +3564,12 @@ static int wifi_resume(struct platform_device *pdev) return 0; } +static const struct of_device_id wifi_device_dt_match[] = { + { .compatible = "android,bcmdhd_wlan", }, + {}, +}; +MODULE_DEVICE_TABLE(of, wifi_device_dt_match); + static struct platform_driver wifi_device = { .probe = wifi_probe, .remove = wifi_remove, @@ -2682,6 +3577,7 @@ static struct platform_driver wifi_device = { .resume = wifi_resume, .driver = { .name = "bcmdhd_wlan", + .of_match_table = wifi_device_dt_match, } }; diff --git a/drivers/net/wireless/bcmdhd/wl_android.h b/drivers/net/wireless/bcmdhd/wl_android.h index c6f37f094e7..602f2da7540 100644 --- a/drivers/net/wireless/bcmdhd/wl_android.h +++ b/drivers/net/wireless/bcmdhd/wl_android.h @@ -1,7 +1,7 @@ /* * Linux cfg80211 driver - Android related functions * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -21,7 +21,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: wl_android.h 367305 2012-11-07 13:49:55Z $ + * $Id: wl_android.h 440872 2013-12-04 05:25:35Z $ */ #include @@ -31,6 +31,9 @@ /* If any feature uses the Generic Netlink Interface, put it here to enable WL_GENL * automatically */ +#if defined(BCMCCX_S69) +#define WL_GENL +#endif #ifdef WL_GENL @@ -99,9 +102,15 @@ enum { BCM_E_SVC_FOUND, BCM_E_DEV_FOUND, BCM_E_DEV_LOST, +#ifdef BCMCCX_S69 + BCM_E_DEV_S69RESP, +#endif BCM_E_MAX }; s32 wl_genl_send_msg(struct net_device *ndev, u32 event_type, u8 *string, u16 len, u8 *hdr, u16 hdrlen); #endif /* WL_GENL */ +#ifdef WLAIBSS +s32 wl_netlink_send_msg(int pid, int seq, void *data, int size); +#endif /* WLAIBSS */ diff --git a/drivers/net/wireless/bcmdhd/wl_cfg80211.c b/drivers/net/wireless/bcmdhd/wl_cfg80211.c index cca71c4c810..c5ffd9fb182 100644 --- a/drivers/net/wireless/bcmdhd/wl_cfg80211.c +++ b/drivers/net/wireless/bcmdhd/wl_cfg80211.c @@ -1,7 +1,8 @@ + /* * Linux cfg80211 driver * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -21,7 +22,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: wl_cfg80211.c 423745 2013-09-13 04:48:46Z $ + * $Id: wl_cfg80211.c 445404 2013-12-26 13:52:07Z $ */ /* */ #include @@ -42,6 +43,9 @@ #include #include #include +#ifdef PNO_SUPPORT +#include +#endif /* PNO_SUPPORT */ #include #include @@ -66,9 +70,10 @@ #endif #ifdef WL11U -#ifndef WL_ENABLE_P2P_IF -#error "You should enable WL_ENABLE_P2P_IF and Only supported in JB" -#endif +#if !defined(WL_ENABLE_P2P_IF) && !defined(WL_CFG80211_P2P_DEV_IF) +#error You should enable 'WL_ENABLE_P2P_IF' or 'WL_CFG80211_P2P_DEV_IF' \ + according to Kernel version and is supported only in Android-JB +#endif /* !WL_ENABLE_P2P_IF && !WL_CFG80211_P2P_DEV_IF */ #endif /* WL11U */ #ifdef BCMWAPI_WPI @@ -116,8 +121,9 @@ u32 wl_dbg_level = WL_DBG_ERR; #ifdef VSDB /* sleep time to keep STA's connecting or connection for continuous af tx or finding a peer */ -#define DEFAULT_SLEEP_TIME_VSDB 120 +#define DEFAULT_SLEEP_TIME_VSDB 120 #define OFF_CHAN_TIME_THRESHOLD_MS 200 +#define AF_RETRY_DELAY_TIME 40 /* if sta is connected or connecting, sleep for a while before retry af tx or finding a peer */ #define WL_AF_TX_KEEP_PRI_CONNECTION_VSDB(wl) \ @@ -173,6 +179,62 @@ static const struct ieee80211_regdomain brcm_regdom = { REG_RULE(5470-10, 5850+10, 40, 6, 20, 0), } }; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 0, 0)) && \ + (defined(WL_IFACE_COMB_NUM_CHANNELS) || defined(WL_CFG80211_P2P_DEV_IF)) +/* + * Possible interface combinations supported by driver + * + * ADHOC Mode - #ADHOC <= 1 on channels = 1 + * SoftAP Mode - #AP <= 1 on channels = 1 + * STA + P2P Mode - #STA <= 2, #{P2P-GO, P2P-client} <= 1, #P2P-device <= 1 + * on channels = 2 + */ +static const struct ieee80211_iface_limit common_if_limits[] = { + { + .max = 1, + .types = BIT(NL80211_IFTYPE_AP), + }, + { + /* + * During P2P-GO removal, P2P-GO is first changed to STA and later only + * removed. So setting maximum possible number of STA interfaces according + * to kernel version. + * + * less than linux-3.8 - max:3 (wlan0 + p2p0 + group removal of p2p-p2p0-x) + * linux-3.8 and above - max:2 (wlan0 + group removal of p2p-wlan0-x) + */ +#ifdef WL_ENABLE_P2P_IF + .max = 3, +#else + .max = 2, +#endif /* WL_ENABLE_P2P_IF */ + .types = BIT(NL80211_IFTYPE_STATION), + }, + { + .max = 2, + .types = BIT(NL80211_IFTYPE_P2P_GO) | BIT(NL80211_IFTYPE_P2P_CLIENT), + }, +#if defined(WL_CFG80211_P2P_DEV_IF) + { + .max = 1, + .types = BIT(NL80211_IFTYPE_P2P_DEVICE), + }, +#endif /* WL_CFG80211_P2P_DEV_IF */ + { + .max = 1, + .types = BIT(NL80211_IFTYPE_ADHOC), + }, +}; +static const struct ieee80211_iface_combination +common_iface_combinations[] = { + { + .num_different_channels = 2, + .max_interfaces = 4, + .limits = common_if_limits, + .n_limits = ARRAY_SIZE(common_if_limits), + }, +}; +#endif /* LINUX_VER >= 3.0 && (WL_IFACE_COMB_NUM_CHANNELS || WL_CFG80211_P2P_DEV_IF) */ /* Data Element Definitions */ #define WPS_ID_CONFIG_METHODS 0x1008 @@ -217,9 +279,10 @@ static const struct ieee80211_regdomain brcm_regdom = { #define DOT11_LEAP_AUTH 0x80 /* LEAP auth frame paylod constants */ #endif /* BCMCCX */ -#ifndef RSSI_OFFSET -#define RSSI_OFFSET 0 -#endif +#ifdef MFP +#define WL_AKM_SUITE_MFP_1X 0x000FAC05 +#define WL_AKM_SUITE_MFP_PSK 0x000FAC06 +#endif /* MFP */ #ifndef IBSS_COALESCE_ALLOWED #define IBSS_COALESCE_ALLOWED 0 @@ -237,8 +300,14 @@ static s32 wl_frame_get_mgmt(u16 fc, const struct ether_addr *da, static s32 __wl_cfg80211_scan(struct wiphy *wiphy, struct net_device *ndev, struct cfg80211_scan_request *request, struct cfg80211_ssid *this_ssid); -static s32 wl_cfg80211_scan(struct wiphy *wiphy, struct net_device *ndev, +#if defined(WL_CFG80211_P2P_DEV_IF) +static s32 +wl_cfg80211_scan(struct wiphy *wiphy, struct cfg80211_scan_request *request); +#else +static s32 +wl_cfg80211_scan(struct wiphy *wiphy, struct net_device *ndev, struct cfg80211_scan_request *request); +#endif /* WL_CFG80211_P2P_DEV_IF */ static s32 wl_cfg80211_set_wiphy_params(struct wiphy *wiphy, u32 changed); static s32 wl_cfg80211_join_ibss(struct wiphy *wiphy, struct net_device *dev, struct cfg80211_ibss_params *params); @@ -254,10 +323,21 @@ static int wl_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev, struct cfg80211_connect_params *sme); static s32 wl_cfg80211_disconnect(struct wiphy *wiphy, struct net_device *dev, u16 reason_code); -static s32 wl_cfg80211_set_tx_power(struct wiphy *wiphy, - enum nl80211_tx_power_setting type, - s32 dbm); +#if defined(WL_CFG80211_P2P_DEV_IF) +static s32 +wl_cfg80211_set_tx_power(struct wiphy *wiphy, struct wireless_dev *wdev, + enum nl80211_tx_power_setting type, s32 mbm); +#else +static s32 +wl_cfg80211_set_tx_power(struct wiphy *wiphy, + enum nl80211_tx_power_setting type, s32 dbm); +#endif /* WL_CFG80211_P2P_DEV_IF */ +#if defined(WL_CFG80211_P2P_DEV_IF) +static s32 wl_cfg80211_get_tx_power(struct wiphy *wiphy, + struct wireless_dev *wdev, s32 *dbm); +#else static s32 wl_cfg80211_get_tx_power(struct wiphy *wiphy, s32 *dbm); +#endif /* WL_CFG80211_P2P_DEV_IF */ static s32 wl_cfg80211_config_default_key(struct wiphy *wiphy, struct net_device *dev, u8 key_idx, bool unicast, bool multicast); @@ -276,11 +356,11 @@ static s32 wl_cfg80211_resume(struct wiphy *wiphy); #if defined(WL_SUPPORT_BACKPORTED_KPATCHES) || (LINUX_VERSION_CODE >= KERNEL_VERSION(3, \ 2, 0)) static s32 wl_cfg80211_mgmt_tx_cancel_wait(struct wiphy *wiphy, - struct net_device *dev, u64 cookie); + bcm_struct_cfgdev *cfgdev, u64 cookie); static s32 wl_cfg80211_del_station(struct wiphy *wiphy, struct net_device *ndev, u8* mac_addr); -#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 2, 0)) */ -#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 39) +#endif /* WL_SUPPORT_BACKPORTED_KPATCHES || KERNEL_VER >= KERNEL_VERSION(3, 2, 0)) */ +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 39)) || defined(WL_COMPAT_WIRELESS) static s32 wl_cfg80211_suspend(struct wiphy *wiphy, struct cfg80211_wowlan *wow); #else static s32 wl_cfg80211_suspend(struct wiphy *wiphy); @@ -294,10 +374,13 @@ static s32 wl_cfg80211_flush_pmksa(struct wiphy *wiphy, static void wl_cfg80211_scan_abort(struct wl_priv *wl); static s32 wl_notify_escan_complete(struct wl_priv *wl, struct net_device *ndev, bool aborted, bool fw_abort); -#if LINUX_VERSION_CODE > KERNEL_VERSION(3, 2, 0) +#if (LINUX_VERSION_CODE > KERNEL_VERSION(3, 2, 0)) || defined(WL_COMPAT_WIRELESS) static s32 wl_cfg80211_tdls_oper(struct wiphy *wiphy, struct net_device *dev, u8 *peer, enum nl80211_tdls_operation oper); -#endif /* LINUX_VERSION_CODE > KERNEL_VERSION(3, 2, 0) */ +#endif /* LINUX_VERSION > KERNEL_VERSION(3,2,0) || WL_COMPAT_WIRELESS */ +#ifdef WL_SCHED_SCAN +static int wl_cfg80211_sched_scan_stop(struct wiphy *wiphy, struct net_device *dev); +#endif /* * event & event Q handlers for cfg80211 interfaces @@ -319,18 +402,16 @@ static void wl_wakeup_event(struct wl_priv *wl); static s32 wl_notify_connect_status_ap(struct wl_priv *wl, struct net_device *ndev, const wl_event_msg_t *e, void *data); static s32 wl_notify_connect_status(struct wl_priv *wl, - struct net_device *ndev, - const wl_event_msg_t *e, void *data); + bcm_struct_cfgdev *cfgdev, const wl_event_msg_t *e, void *data); static s32 wl_notify_roaming_status(struct wl_priv *wl, - struct net_device *ndev, - const wl_event_msg_t *e, void *data); -static s32 wl_notify_scan_status(struct wl_priv *wl, struct net_device *ndev, + bcm_struct_cfgdev *cfgdev, const wl_event_msg_t *e, void *data); +static s32 wl_notify_scan_status(struct wl_priv *wl, bcm_struct_cfgdev *cfgdev, const wl_event_msg_t *e, void *data); static s32 wl_bss_connect_done(struct wl_priv *wl, struct net_device *ndev, const wl_event_msg_t *e, void *data, bool completed); static s32 wl_bss_roaming_done(struct wl_priv *wl, struct net_device *ndev, const wl_event_msg_t *e, void *data); -static s32 wl_notify_mic_status(struct wl_priv *wl, struct net_device *ndev, +static s32 wl_notify_mic_status(struct wl_priv *wl, bcm_struct_cfgdev *cfgdev, const wl_event_msg_t *e, void *data); #ifdef WL_SCHED_SCAN static s32 @@ -338,13 +419,20 @@ wl_notify_sched_scan_results(struct wl_priv *wl, struct net_device *ndev, const wl_event_msg_t *e, void *data); #endif /* WL_SCHED_SCAN */ #ifdef PNO_SUPPORT -static s32 wl_notify_pfn_status(struct wl_priv *wl, struct net_device *ndev, +static s32 wl_notify_pfn_status(struct wl_priv *wl, bcm_struct_cfgdev *cfgdev, const wl_event_msg_t *e, void *data); #endif /* PNO_SUPPORT */ static s32 wl_notifier_change_state(struct wl_priv *wl, struct net_info *_net_info, enum wl_status state, bool set); -static s32 wl_tdls_event_handler(struct wl_priv *wl, struct net_device *ndev, + +#ifdef WLTDLS +static s32 wl_tdls_event_handler(struct wl_priv *wl, bcm_struct_cfgdev *cfgdev, const wl_event_msg_t *e, void *data); +#endif /* WLTDLS */ +#ifdef BCMCCX_S69 +static s32 wl_ccx_s69_response(struct wl_priv *wl, bcm_struct_cfgdev *cfgdev, + const wl_event_msg_t *e, void *data); +#endif /* * register/deregister parent device */ @@ -395,9 +483,13 @@ static void wl_ch_to_chanspec(int ch, */ static void wl_rst_ie(struct wl_priv *wl); static __used s32 wl_add_ie(struct wl_priv *wl, u8 t, u8 l, u8 *v); +static void wl_update_hidden_ap_ie(struct wl_bss_info *bi, u8 *ie_stream, u32 *ie_size); static s32 wl_mrg_ie(struct wl_priv *wl, u8 *ie_stream, u16 ie_size); static s32 wl_cp_ie(struct wl_priv *wl, u8 *dst, u16 dst_size); static u32 wl_get_ielen(struct wl_priv *wl); +#ifdef MFP +static int wl_cfg80211_get_rsn_capa(bcm_tlv_t *wpa2ie, u8* capa); +#endif #ifdef WL11U bcm_tlv_t * @@ -407,14 +499,16 @@ wl_cfg80211_add_iw_ie(struct wl_priv *wl, struct net_device *ndev, s32 bssidx, s uint8 ie_id, uint8 *data, uint8 data_len); #endif /* WL11U */ -static s32 wl_setup_wiphy(struct wireless_dev *wdev, struct device *dev); +static s32 wl_setup_wiphy(struct wireless_dev *wdev, struct device *dev, void *data); static void wl_free_wdev(struct wl_priv *wl); static s32 wl_inform_bss(struct wl_priv *wl); -static s32 wl_inform_single_bss(struct wl_priv *wl, struct wl_bss_info *bi, u8 is_roam_done); -static s32 wl_update_bss_info(struct wl_priv *wl, struct net_device *ndev, u8 is_roam_done); +static s32 wl_inform_single_bss(struct wl_priv *wl, struct wl_bss_info *bi); +static s32 wl_update_bss_info(struct wl_priv *wl, struct net_device *ndev); static chanspec_t wl_cfg80211_get_shared_freq(struct wiphy *wiphy); s32 wl_cfg80211_channel_to_freq(u32 channel); + + static void wl_cfg80211_work_handler(struct work_struct *work); static s32 wl_add_keyext(struct wiphy *wiphy, struct net_device *dev, u8 key_idx, const u8 *mac_addr, @@ -490,7 +584,6 @@ static s32 wl_free_debugfs(struct wl_priv *wl); static wl_scan_params_t *wl_cfg80211_scan_alloc_params(int channel, int nprobes, int *out_params_size); -static void get_primary_mac(struct wl_priv *wl, struct ether_addr *mac); static bool check_dev_role_integrity(struct wl_priv *wl, u32 dev_role); /* @@ -523,6 +616,17 @@ do { \ } \ } while (0) +#ifdef RSSI_OFFSET +static s32 wl_rssi_offset(s32 rssi) +{ + rssi += RSSI_OFFSET; + if (rssi > 0) + rssi = 0; + return rssi; +} +#else +#define wl_rssi_offset(x) x +#endif #define IS_WPA_AKM(akm) ((akm) == RSN_AKM_NONE || \ (akm) == RSN_AKM_UNSPECIFIED || \ @@ -679,6 +783,10 @@ static const u32 __wl_cipher_suites[] = { #define BLOCK_GON_REQ_MAX_NUM 5 #endif /* WL_CFG80211_GON_COLLISION */ +#if defined(USE_DYNAMIC_MAXPKT_RXGLOM) +static int maxrxpktglom = 0; +#endif + /* IOCtl version read from targeted driver */ static int ioctl_version; #ifdef DEBUGFS_CFG80211 @@ -696,6 +804,34 @@ static const struct { }; #endif +#if defined(CUSTOMER_HW4) && defined(DHD_DEBUG) +uint prev_dhd_console_ms = 0; +u32 prev_wl_dbg_level = 0; +bool wl_scan_timeout_dbg_enabled = 0; +static void wl_scan_timeout_dbg_set(void); +static void wl_scan_timeout_dbg_clear(void); + +static void wl_scan_timeout_dbg_set(void) +{ + WL_ERR(("Enter \n")); + prev_dhd_console_ms = dhd_console_ms; + prev_wl_dbg_level = wl_dbg_level; + + dhd_console_ms = 1; + wl_dbg_level |= (WL_DBG_ERR | WL_DBG_P2P_ACTION | WL_DBG_SCAN); + + wl_scan_timeout_dbg_enabled = 1; +} +static void wl_scan_timeout_dbg_clear(void) +{ + WL_ERR(("Enter \n")); + dhd_console_ms = prev_dhd_console_ms; + wl_dbg_level = prev_wl_dbg_level; + + wl_scan_timeout_dbg_enabled = 0; +} +#endif /* CUSTOMER_HW4 && DHD_DEBUG */ + static void wl_add_remove_pm_enable_work(struct wl_priv *wl, bool add_remove, enum wl_handler_del_type type) { @@ -719,15 +855,16 @@ static void wl_add_remove_pm_enable_work(struct wl_priv *wl, bool add_remove, break; case WL_HANDLER_DEL: default: - wl->pm_enable_work_on = false; - break; - } + wl->pm_enable_work_on = false; #ifdef CUSTOMER_HW4 - DHD_OS_WAKE_UNLOCK(wl->pub); + DHD_OS_WAKE_UNLOCK(wl->pub); #endif /* CUSTOMER_HW4 */ + break; + } } } } + /* Return a new chanspec given a legacy chanspec * Returns INVCHANSPEC on error */ @@ -918,7 +1055,14 @@ wl_cfg80211_default_mgmt_stypes[NUM_NL80211_IFTYPES] = { BIT(IEEE80211_STYPE_AUTH >> 4) | BIT(IEEE80211_STYPE_DEAUTH >> 4) | BIT(IEEE80211_STYPE_ACTION >> 4) - } + }, +#if defined(WL_CFG80211_P2P_DEV_IF) + [NL80211_IFTYPE_P2P_DEVICE] = { + .tx = 0xffff, + .rx = BIT(IEEE80211_STYPE_ACTION >> 4) | + BIT(IEEE80211_STYPE_PROBE_REQ >> 4) + }, +#endif /* WL_CFG80211_P2P_DEV_IF */ }; static void swap_key_from_BE(struct wl_wsec_key *key) @@ -943,7 +1087,7 @@ static void swap_key_to_BE(struct wl_wsec_key *key) key->iv_initialized = dtoh32(key->iv_initialized); } -#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 4, 0) +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 4, 0)) && !defined(WL_COMPAT_WIRELESS) /* For debug: Dump the contents of the encoded wps ie buffe */ static void wl_validate_wps_ie(char *wps_ie, s32 wps_ie_len, bool *pbc) @@ -1027,7 +1171,7 @@ wl_validate_wps_ie(char *wps_ie, s32 wps_ie_len, bool *pbc) subel += subelt_len; } } -#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(3, 4, 0) */ +#endif /* LINUX_VERSION < VERSION(3, 4, 0) && !WL_COMPAT_WIRELESS */ static chanspec_t wl_cfg80211_get_shared_freq(struct wiphy *wiphy) { @@ -1057,14 +1201,16 @@ static chanspec_t wl_cfg80211_get_shared_freq(struct wiphy *wiphy) else { bss = (struct wl_bss_info *) (wl->extra_buf + 4); chspec = bss->chanspec; - WL_DBG(("Valid BSS Found. chanspec:%d \n", bss->chanspec)); + + WL_DBG(("Valid BSS Found. chanspec:%d \n", chspec)); } return chspec; } -static struct net_device* wl_cfg80211_add_monitor_if(char *name) +static bcm_struct_cfgdev * +wl_cfg80211_add_monitor_if(char *name) { -#if defined(WLP2P) && defined(WL_ENABLE_P2P_IF) +#if defined(WL_ENABLE_P2P_IF) || defined(WL_CFG80211_P2P_DEV_IF) WL_INFO(("wl_cfg80211_add_monitor_if: No more support monitor interface\n")); return ERR_PTR(-EOPNOTSUPP); #else @@ -1072,12 +1218,17 @@ static struct net_device* wl_cfg80211_add_monitor_if(char *name) dhd_add_monitor(name, &ndev); WL_INFO(("wl_cfg80211_add_monitor_if net device returned: 0x%p\n", ndev)); - return ndev; -#endif /* defined(WLP2P) && defined(WL_ENABLE_P2P_IF) */ + return ndev_to_cfgdev(ndev); +#endif /* WL_ENABLE_P2P_IF || WL_CFG80211_P2P_DEV_IF */ } -static struct net_device * -wl_cfg80211_add_virtual_iface(struct wiphy *wiphy, char *name, +static bcm_struct_cfgdev * +wl_cfg80211_add_virtual_iface(struct wiphy *wiphy, +#if defined(WL_CFG80211_P2P_DEV_IF) + const char *name, +#else + char *name, +#endif /* WL_CFG80211_P2P_DEV_IF */ enum nl80211_iftype type, u32 *flags, struct vif_params *params) { @@ -1105,7 +1256,6 @@ wl_cfg80211_add_virtual_iface(struct wiphy *wiphy, char *name, dhd = (dhd_pub_t *)(wl->pub); #endif /* PROP_TXSTATUS_VSDB */ - /* Use primary I/F for sending cmds down to firmware */ _ndev = wl_to_prmry_ndev(wl); @@ -1119,7 +1269,11 @@ wl_cfg80211_add_virtual_iface(struct wiphy *wiphy, char *name, mode = WL_MODE_IBSS; return NULL; case NL80211_IFTYPE_MONITOR: - return wl_cfg80211_add_monitor_if(name); + return wl_cfg80211_add_monitor_if((char *)name); +#if defined(WL_CFG80211_P2P_DEV_IF) + case NL80211_IFTYPE_P2P_DEVICE: + return wl_cfgp2p_add_p2p_disc_if(); +#endif /* WL_CFG80211_P2P_DEV_IF */ case NL80211_IFTYPE_P2P_CLIENT: case NL80211_IFTYPE_STATION: wlif_type = WL_P2P_IF_CLIENT; @@ -1193,10 +1347,9 @@ wl_cfg80211_add_virtual_iface(struct wiphy *wiphy, char *name, memset(wl->p2p->vir_ifname, 0, IFNAMSIZ); strncpy(wl->p2p->vir_ifname, name, IFNAMSIZ - 1); - wl_cfg80211_scan_abort(wl); #ifdef PROP_TXSTATUS_VSDB - if (!wl->wlfc_on && !disable_proptx) { + if (dhd->op_mode != DHD_FLAG_IBSS_MODE && !wl->wlfc_on && !disable_proptx) { dhd->wlfc_enabled = true; dhd_wlfc_init(dhd); err = wldev_ioctl(_ndev, WLC_UP, &up, sizeof(s32), true); @@ -1270,6 +1423,10 @@ wl_cfg80211_add_virtual_iface(struct wiphy *wiphy, char *name, else if (type == NL80211_IFTYPE_P2P_GO) dhd_mode = DHD_FLAG_P2P_GO_MODE; DNGL_FUNC(dhd_cfg80211_set_p2p_info, (wl, dhd_mode)); +#ifdef PROP_TXSTATUS_VSDB + if (dhd->op_mode != DHD_FLAG_IBSS_MODE && dhd->plat_enable) + dhd->plat_enable((void *)dhd); +#endif /* PROP_TXSTATUS_VSDB */ /* reinitialize completion to clear previous count */ INIT_COMPLETION(wl->iface_disable); } else { @@ -1281,17 +1438,18 @@ wl_cfg80211_add_virtual_iface(struct wiphy *wiphy, char *name, /* put back the rtnl_lock again */ if (rollback_lock) rtnl_lock(); - return _ndev; - + return ndev_to_cfgdev(_ndev); } else { wl_clr_p2p_status(wl, IF_ADD); WL_ERR((" virtual interface(%s) is not created \n", wl->p2p->vir_ifname)); memset(wl->p2p->vir_ifname, '\0', IFNAMSIZ); wl->p2p->vif_created = false; #ifdef PROP_TXSTATUS_VSDB - if (dhd->wlfc_enabled && wl->wlfc_on) { + if (dhd->op_mode != DHD_FLAG_IBSS_MODE && dhd->wlfc_enabled && wl->wlfc_on) { dhd->wlfc_enabled = false; dhd_wlfc_deinit(dhd); + if (dhd->plat_deinit) + dhd->plat_deinit((void *)dhd); wl->wlfc_on = false; } #endif /* PROP_TXSTATUS_VSDB */ @@ -1304,8 +1462,9 @@ wl_cfg80211_add_virtual_iface(struct wiphy *wiphy, char *name, } static s32 -wl_cfg80211_del_virtual_iface(struct wiphy *wiphy, struct net_device *dev) +wl_cfg80211_del_virtual_iface(struct wiphy *wiphy, bcm_struct_cfgdev *cfgdev) { + struct net_device *dev = NULL; struct ether_addr p2p_mac; struct wl_priv *wl = wiphy_priv(wiphy); s32 timeout = -1; @@ -1313,12 +1472,13 @@ wl_cfg80211_del_virtual_iface(struct wiphy *wiphy, struct net_device *dev) s32 index = -1; WL_DBG(("Enter\n")); - if (wl->p2p_net == dev) { - /* Since there is no ifidx corresponding to p2p0, cmds to - * firmware should be routed through primary I/F - */ - dev = wl_to_prmry_ndev(wl); +#if defined(WL_CFG80211_P2P_DEV_IF) + if (cfgdev->iftype == NL80211_IFTYPE_P2P_DEVICE) { + return wl_cfgp2p_del_p2p_disc_if(cfgdev); } +#endif /* WL_CFG80211_P2P_DEV_IF */ + dev = cfgdev_to_wlc_ndev(cfgdev, wl); + if (wl_cfgp2p_find_idx(wl, dev, &index) != BCME_OK) { WL_ERR(("Find p2p index from ndev(%p) failed\n", dev)); return BCME_ERROR; @@ -1360,10 +1520,8 @@ wl_cfg80211_del_virtual_iface(struct wiphy *wiphy, struct net_device *dev) WL_ERR(("Wait for Link Down event for GO !!!\n")); wait_for_completion_timeout(&wl->iface_disable, msecs_to_jiffies(500)); -#ifndef CUSTOMER_HW4 } else if (ret != BCME_UNSUPPORTED) { - OSL_SLEEP(300); -#endif /* !CUSTOMER_HW4 */ + msleep(300); } } wl_cfgp2p_clear_management_ie(wl, index); @@ -1396,6 +1554,9 @@ wl_cfg80211_del_virtual_iface(struct wiphy *wiphy, struct net_device *dev) WL_ERR(("IFDEL didn't complete properly\n")); } ret = dhd_del_monitor(dev); + if (wl_get_mode_by_netdev(wl, dev) == WL_MODE_AP) { + DHD_OS_WAKE_LOCK_CTRL_TIMEOUT_CANCEL((dhd_pub_t *)(wl->pub)); + } } } return ret; @@ -1463,7 +1624,7 @@ wl_cfg80211_change_virtual_iface(struct wiphy *wiphy, struct net_device *ndev, ndev->name, ap, infra, type)); wl_set_p2p_status(wl, IF_CHANGING); wl_clr_p2p_status(wl, IF_CHANGED); - err = wl_cfgp2p_ifchange(wl, &wl->p2p->int_addr, htod32(wlif_type), chspec); + wl_cfgp2p_ifchange(wl, &wl->p2p->int_addr, htod32(wlif_type), chspec); wait_event_interruptible_timeout(wl->netif_change_event, (wl_get_p2p_status(wl, IF_CHANGED) == true), msecs_to_jiffies(MAX_WAIT_TIME)); @@ -1497,7 +1658,7 @@ wl_cfg80211_change_virtual_iface(struct wiphy *wiphy, struct net_device *ndev, if (err < 0) { WL_ERR(("SET Adhoc error %d\n", err)); return -EINVAL; - } + } } ndev->ieee80211_ptr->iftype = type; @@ -1593,9 +1754,11 @@ wl_cfg80211_ifdel_ops(struct net_device *ndev) WL_DBG(("type : %d\n", type)); #ifdef PROP_TXSTATUS_VSDB - if (dhd->wlfc_enabled && wl->wlfc_on) { + if (dhd->op_mode != DHD_FLAG_IBSS_MODE && dhd->wlfc_enabled && wl->wlfc_on) { dhd->wlfc_enabled = false; dhd_wlfc_deinit(dhd); + if (dhd->plat_deinit) + dhd->plat_deinit((void *)dhd); wl->wlfc_on = false; } #endif /* PROP_TXSTATUS_VSDB */ @@ -1822,21 +1985,19 @@ wl_run_iscan(struct wl_iscan_ctrl *iscan, struct cfg80211_scan_request *request, struct wl_iscan_params *params = NULL; s32 err = 0; - if (request == NULL) { - err = -EINVAL; - goto done; - } - n_channels = request->n_channels; - n_ssids = request->n_ssids; - /* Allocate space for populating ssids in wl_iscan_params struct */ - if (n_channels % 2) - /* If n_channels is odd, add a padd of u16 */ - params_size += sizeof(u16) * (n_channels + 1); - else - params_size += sizeof(u16) * n_channels; + if (request != NULL) { + n_channels = request->n_channels; + n_ssids = request->n_ssids; + /* Allocate space for populating ssids in wl_iscan_params struct */ + if (n_channels % 2) + /* If n_channels is odd, add a padd of u16 */ + params_size += sizeof(u16) * (n_channels + 1); + else + params_size += sizeof(u16) * n_channels; - /* Allocate space for populating ssids in wl_iscan_params struct */ - params_size += sizeof(struct wlc_ssid) * n_ssids; + /* Allocate space for populating ssids in wl_iscan_params struct */ + params_size += sizeof(struct wlc_ssid) * n_ssids; + } params = (struct wl_iscan_params *)kzalloc(params_size, GFP_KERNEL); if (!params) { err = -ENOMEM; @@ -1913,7 +2074,12 @@ wl_get_valid_channels(struct net_device *ndev, u8 *valid_chan_list, s32 size) #if defined(USE_INITIAL_2G_SCAN) || defined(USE_INITIAL_SHORT_DWELL_TIME) #define FIRST_SCAN_ACTIVE_DWELL_TIME_MS 40 -static bool g_first_broadcast_scan = TRUE; +#ifdef SUPPORT_DEEP_SLEEP +bool +#else +static bool +#endif /* SUPPORT_DEEP_SLEEP */ +g_first_broadcast_scan = TRUE; #endif /* USE_INITIAL_2G_SCAN || USE_INITIAL_SHORT_DWELL_TIME */ static s32 @@ -1941,7 +2107,8 @@ wl_run_escan(struct wl_priv *wl, struct net_device *ndev, WL_DBG(("Enter \n")); - if (!request || !wl) { + /* scan request can come with empty request : perform all default scan */ + if (!wl) { err = -EINVAL; goto exit; } @@ -1950,6 +2117,10 @@ wl_run_escan(struct wl_priv *wl, struct net_device *ndev, WL_SCAN((" LEGACY E-SCAN START\n")); #if defined(USE_INITIAL_2G_SCAN) || defined(USE_INITIAL_SHORT_DWELL_TIME) + if (!request) { + err = -EINVAL; + goto exit; + } if (ndev == wl_to_prmry_ndev(wl) && g_first_broadcast_scan == true) { #ifdef USE_INITIAL_2G_SCAN struct ieee80211_channel tmp_channel_list[CH_MAX_2G_CHANNEL]; @@ -1999,17 +2170,20 @@ wl_run_escan(struct wl_priv *wl, struct net_device *ndev, } #endif /* USE_INITIAL_2G_SCAN || USE_INITIAL_SHORT_DWELL_TIME */ - n_channels = request->n_channels; - n_ssids = request->n_ssids; - /* Allocate space for populating ssids in wl_iscan_params struct */ - if (n_channels % 2) - /* If n_channels is odd, add a padd of u16 */ - params_size += sizeof(u16) * (n_channels + 1); - else - params_size += sizeof(u16) * n_channels; + /* if scan request is not empty parse scan request paramters */ + if (request != NULL) { + n_channels = request->n_channels; + n_ssids = request->n_ssids; + /* Allocate space for populating ssids in wl_iscan_params struct */ + if (n_channels % 2) + /* If n_channels is odd, add a padd of u16 */ + params_size += sizeof(u16) * (n_channels + 1); + else + params_size += sizeof(u16) * n_channels; - /* Allocate space for populating ssids in wl_iscan_params struct */ - params_size += sizeof(struct wlc_ssid) * n_ssids; + /* Allocate space for populating ssids in wl_iscan_params struct */ + params_size += sizeof(struct wlc_ssid) * n_ssids; + } params = (wl_escan_params_t *) kzalloc(params_size, GFP_KERNEL); if (params == NULL) { err = -ENOMEM; @@ -2025,11 +2199,7 @@ wl_run_escan(struct wl_priv *wl, struct net_device *ndev, params->version = htod32(ESCAN_REQ_VERSION); params->action = htod16(action); -#if defined(CUSTOMER_HW4) && defined(DUAL_ESCAN_RESULT_BUFFER) - params->sync_id = wl->escan_info.cur_sync_id; -#else - params->sync_id = htod16(0x1234); -#endif + wl_escan_set_sync_id(params->sync_id, wl); if (params_size + sizeof("escan") >= WLC_IOCTL_MEDLEN) { WL_ERR(("ioctl buffer length not sufficient\n")); kfree(params); @@ -2038,8 +2208,13 @@ wl_run_escan(struct wl_priv *wl, struct net_device *ndev, } err = wldev_iovar_setbuf(ndev, "escan", params, params_size, wl->escan_ioctl_buf, WLC_IOCTL_MEDLEN, NULL); - if (unlikely(err)) - WL_ERR((" Escan set error (%d)\n", err)); + if (unlikely(err)) { + if (err == BCME_EPERM) + /* Scan Not permitted at this point of time */ + WL_DBG((" Escan not permitted at this time (%d)\n", err)); + else + WL_ERR((" Escan set error (%d)\n", err)); + } kfree(params); } else if (p2p_is_on(wl) && p2p_scan(wl)) { @@ -2058,7 +2233,7 @@ wl_run_escan(struct wl_priv *wl, struct net_device *ndev, } if (!wl_get_valid_channels(ndev, chan_buf, sizeof(chan_buf))) { #ifdef CUSTOMER_HW4 - int SS_WAR_Printed = false; + int is_printed = false; #endif list = (wl_uint32_list_t *) chan_buf; n_valid_chan = dtoh32(list->count); @@ -2084,11 +2259,10 @@ wl_run_escan(struct wl_priv *wl, struct net_device *ndev, | IEEE80211_CHAN_PASSIVE_SCAN)) continue; #ifdef CUSTOMER_HW4 - /* CUSTOMER want to skip these channels explicitly */ if (channel >= 52 && channel <= 140) { - if (SS_WAR_Printed == false) { + if (is_printed == false) { WL_ERR(("SKIP DFS CHANs(52~140)\n")); - SS_WAR_Printed = true; + is_printed = true; } continue; } @@ -2120,14 +2294,14 @@ wl_run_escan(struct wl_priv *wl, struct net_device *ndev, search_state = WL_P2P_DISC_ST_SEARCH; num_chans = n_nodfs; p2p_scan_purpose = P2P_SCAN_NORMAL; + } else if (num_chans == 1) { p2p_scan_purpose = P2P_SCAN_CONNECT_TRY; } else if (num_chans == SOCIAL_CHAN_CNT + 1) { - /* SOCIAL_CHAN_CNT + 1 takes care of the Progressive scan - * supported by the supplicant - */ + /* SOCIAL_CHAN_CNT + 1 takes care of the Progressive scan supported by + * the supplicant + */ p2p_scan_purpose = P2P_SCAN_SOCIAL_CHANNEL; - } else { WL_INFO(("P2P SCAN STATE START \n")); num_chans = n_nodfs; @@ -2149,7 +2323,11 @@ wl_run_escan(struct wl_priv *wl, struct net_device *ndev, } exit: if (unlikely(err)) { - WL_ERR(("error (%d)\n", err)); + /* Don't print Error incase of Scan suppress */ + if ((err == BCME_EPERM) && wl->scan_suppressed) + WL_DBG(("Escan failed: Scan Suppressed \n")); + else + WL_ERR(("error (%d)\n", err)); } return err; } @@ -2164,11 +2342,8 @@ wl_do_escan(struct wl_priv *wl, struct wiphy *wiphy, struct net_device *ndev, wl_scan_results_t *results; WL_SCAN(("Enter \n")); mutex_lock(&wl->usr_sync); -#if defined(CUSTOMER_HW4) && defined(DUAL_ESCAN_RESULT_BUFFER) - results = (wl_scan_results_t *) wl->escan_info.escan_buf[wl->escan_info.cur_sync_id % 2]; -#else - results = (wl_scan_results_t *) wl->escan_info.escan_buf; -#endif + + results = wl_escan_get_buf(wl, FALSE); results->version = 0; results->count = 0; results->buflen = WL_SCAN_RESULTS_FIXED_SIZE; @@ -2221,12 +2396,7 @@ __wl_cfg80211_scan(struct wiphy *wiphy, struct net_device *ndev, return -EINVAL; } - /* If scan req comes for p2p0, send it over primary I/F - * Scan results will be delivered corresponding to cfg80211_scan_request - */ - if (ndev == wl->p2p_net) { - ndev = wl_to_prmry_ndev(wl); - } + ndev = ndev_to_wlc_ndev(ndev, wl); if (WL_DRV_STATUS_SENDING_AF_FRM_EXT(wl)) { WL_ERR(("Sending Action Frames. Try it again.\n")); @@ -2459,7 +2629,8 @@ __wl_cfg80211_scan(struct wiphy *wiphy, struct net_device *ndev, MAC2STRDBG(bssid.octet))); else WL_ERR(("GET BSSID failed with %d\n", ret)); - wl_notify_escan_complete(wl, ndev, true, true); + + wl_cfg80211_scan_abort(wl); } } else { busy_count = 0; @@ -2475,19 +2646,30 @@ __wl_cfg80211_scan(struct wiphy *wiphy, struct net_device *ndev, return err; } +#if defined(WL_CFG80211_P2P_DEV_IF) +static s32 +wl_cfg80211_scan(struct wiphy *wiphy, struct cfg80211_scan_request *request) +#else static s32 wl_cfg80211_scan(struct wiphy *wiphy, struct net_device *ndev, struct cfg80211_scan_request *request) +#endif /* WL_CFG80211_P2P_DEV_IF */ { s32 err = 0; struct wl_priv *wl = wiphy_priv(wiphy); +#if defined(WL_CFG80211_P2P_DEV_IF) + struct net_device *ndev = wdev_to_wlc_ndev(request->wdev, wl); +#endif /* WL_CFG80211_P2P_DEV_IF */ WL_DBG(("Enter \n")); RETURN_EIO_IF_NOT_UP(wl); err = __wl_cfg80211_scan(wiphy, ndev, request, NULL); if (unlikely(err)) { - WL_ERR(("scan error (%d)\n", err)); + if ((err == BCME_EPERM) && wl->scan_suppressed) + WL_DBG(("scan not permitted at this time (%d)\n", err)); + else + WL_ERR(("scan error (%d)\n", err)); return err; } @@ -2572,7 +2754,8 @@ static s32 wl_cfg80211_set_wiphy_params(struct wiphy *wiphy, u32 changed) return err; } -static chanspec_t channel_to_chanspec(struct wiphy *wiphy, struct net_device *dev, u32 channel) +static chanspec_t +channel_to_chanspec(struct wiphy *wiphy, struct net_device *dev, u32 channel, u32 bw_cap) { struct wl_priv *wl = wiphy_priv(wiphy); u8 *buf = NULL; @@ -2610,7 +2793,7 @@ static chanspec_t channel_to_chanspec(struct wiphy *wiphy, struct net_device *de } if (CHSPEC_IS20(c)) { tmp_c = CHSPEC_CHANNEL(c); - tmp_bw = 20; + tmp_bw = WLC_BW_CAP_20MHZ; } else if (CHSPEC_IS40(c)) { tmp_c = CHSPEC_CHANNEL(c); @@ -2619,7 +2802,7 @@ static chanspec_t channel_to_chanspec(struct wiphy *wiphy, struct net_device *de } else { tmp_c -= CH_10MHZ_APART; } - tmp_bw = 40; + tmp_bw = WLC_BW_CAP_40MHZ; } else { tmp_c = CHSPEC_CHANNEL(c); @@ -2634,14 +2817,16 @@ static chanspec_t channel_to_chanspec(struct wiphy *wiphy, struct net_device *de /* WL_CHANSPEC_CTL_SB_UU */ tmp_c += (CH_10MHZ_APART + CH_20MHZ_APART); } - tmp_bw = 80; + tmp_bw = WLC_BW_CAP_80MHZ; } if (tmp_c != channel) continue; - if (tmp_bw > bw) { + if ((tmp_bw > bw) && (tmp_bw <= bw_cap)) { bw = tmp_bw; ret_c = c; + if (bw == bw_cap) + goto exit; } } exit: @@ -2693,6 +2878,8 @@ wl_cfg80211_ibss_vsie_delete(struct net_device *dev) /* change the command from "add" to "del" */ strncpy(wl->ibss_vsie->cmd, "del", VNDR_IE_CMD_LEN - 1); + wl->ibss_vsie->cmd[VNDR_IE_CMD_LEN - 1] = '\0'; + ret = wldev_iovar_setbuf(dev, "ie", wl->ibss_vsie, wl->ibss_vsie_len, ioctl_buf, WLC_IOCTL_MEDLEN, NULL); @@ -2726,7 +2913,9 @@ wl_cfg80211_join_ibss(struct wiphy *wiphy, struct net_device *dev, s32 err = 0; int scan_suppress = 1; size_t join_params_size; - chanspec_t chanspec; + chanspec_t chanspec = 0; + u32 param[2] = {0, 0}; + u32 bw_cap = 0; WL_TRACE(("In\n")); RETURN_EIO_IF_NOT_UP(wl); @@ -2735,11 +2924,21 @@ wl_cfg80211_join_ibss(struct wiphy *wiphy, struct net_device *dev, WL_ERR(("Invalid parameter\n")); return -EINVAL; } + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0)) + chan = params->chandef.chan; +#else + chan = params->channel; +#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0)) */ + if (chan) + wl->channel = ieee80211_frequency_to_channel(chan->center_freq); if (wl_get_drv_status(wl, CONNECTED, dev)) { struct wlc_ssid *ssid = (struct wlc_ssid *)wl_read_prof(wl, dev, WL_PROF_SSID); u8 *bssid = (u8 *)wl_read_prof(wl, dev, WL_PROF_BSSID); - if (!params->bssid || (memcmp(params->bssid, bssid, ETHER_ADDR_LEN) == 0 && - memcmp(params->ssid, ssid->SSID, ssid->SSID_len) == 0)) { + u32 *channel = (u32 *)wl_read_prof(wl, dev, WL_PROF_CHAN); + if (!params->bssid || ((memcmp(params->bssid, bssid, ETHER_ADDR_LEN) == 0) && + (memcmp(params->ssid, ssid->SSID, ssid->SSID_len) == 0) && + (*channel == wl->channel))) { WL_ERR(("Connection already existed to " MACDBG "\n", MAC2STRDBG((u8 *)wl_read_prof(wl, dev, WL_PROF_BSSID)))); return -EISCONN; @@ -2780,10 +2979,19 @@ wl_cfg80211_join_ibss(struct wiphy *wiphy, struct net_device *dev, } else { wl->ibss_starter = true; } - chan = params->channel; - if (chan) - wl->channel = ieee80211_frequency_to_channel(chan->center_freq); - chanspec = channel_to_chanspec(wiphy, dev, wl->channel); + if (chan) { + if (chan->band == IEEE80211_BAND_5GHZ) + param[0] = WLC_BAND_5G; + else if (chan->band == IEEE80211_BAND_2GHZ) + param[0] = WLC_BAND_2G; + err = wldev_iovar_getint(dev, "bw_cap", param); + if (unlikely(err)) { + WL_ERR(("Get bw_cap Failed (%d)\n", err)); + return err; + } + bw_cap = param[0]; + chanspec = channel_to_chanspec(wiphy, dev, wl->channel, bw_cap); + } /* * Join with specific BSSID and cached SSID * If SSID is zero join based on BSSID only @@ -2842,6 +3050,10 @@ wl_cfg80211_join_ibss(struct wiphy *wiphy, struct net_device *dev, } } wl_update_prof(wl, dev, NULL, &join_params.ssid, WL_PROF_SSID); + wl_update_prof(wl, dev, NULL, &wl->channel, WL_PROF_CHAN); +#ifdef WLAIBSS + wl->aibss_txfail_seq = 0; /* initialize the sequence */ +#endif /* WLAIBSS */ return err; } @@ -2873,6 +3085,44 @@ static s32 wl_cfg80211_leave_ibss(struct wiphy *wiphy, struct net_device *dev) return err; } +#ifdef MFP +static int wl_cfg80211_get_rsn_capa(bcm_tlv_t *wpa2ie, u8* capa) +{ + u16 suite_count; + wpa_suite_mcast_t *mcast; + wpa_suite_ucast_t *ucast; + u16 len; + wpa_suite_auth_key_mgmt_t *mgmt; + + if (!wpa2ie) + return -1; + + len = wpa2ie->len; + mcast = (wpa_suite_mcast_t *)&wpa2ie->data[WPA2_VERSION_LEN]; + if ((len -= WPA_SUITE_LEN) <= 0) + return BCME_BADLEN; + ucast = (wpa_suite_ucast_t *)&mcast[1]; + suite_count = ltoh16_ua(&ucast->count); + if ((suite_count > NL80211_MAX_NR_CIPHER_SUITES) || + (len -= (WPA_IE_SUITE_COUNT_LEN + + (WPA_SUITE_LEN * suite_count))) <= 0) + return BCME_BADLEN; + + mgmt = (wpa_suite_auth_key_mgmt_t *)&ucast->list[suite_count]; + suite_count = ltoh16_ua(&mgmt->count); + + if ((suite_count > NL80211_MAX_NR_CIPHER_SUITES) || + (len -= (WPA_IE_SUITE_COUNT_LEN + + (WPA_SUITE_LEN * suite_count))) >= RSN_CAP_LEN) { + capa[0] = *(u8 *)&mgmt->list[suite_count]; + capa[1] = *((u8 *)&mgmt->list[suite_count] + 1); + } else + return BCME_BADLEN; + + return 0; +} +#endif /* MFP */ + static s32 wl_set_wpa_version(struct net_device *dev, struct cfg80211_connect_params *sme) { @@ -2934,7 +3184,7 @@ wl_set_set_wapi_ie(struct net_device *dev, struct cfg80211_connect_params *sme) return BCME_ERROR; } - WL_DBG(("Enter\n")); + WL_DBG((" %s \n", __FUNCTION__)); if (sme->crypto.wpa_versions & NL80211_WAPI_VERSION_1) { err = wldev_iovar_setbuf_bsscfg(dev, "wapiie", sme->ie, @@ -2979,7 +3229,7 @@ wl_set_auth_type(struct net_device *dev, struct cfg80211_connect_params *sme) #ifdef BCMCCX case NL80211_AUTHTYPE_NETWORK_EAP: WL_DBG(("network eap\n")); - val = WL_AUTH_OPEN_SYSTEM; + val = DOT11_LEAP_AUTH; break; #endif default: @@ -3006,6 +3256,13 @@ wl_set_set_cipher(struct net_device *dev, struct cfg80211_connect_params *sme) s32 pval = 0; s32 gval = 0; s32 err = 0; + s32 wsec_val = 0; +#ifdef MFP + s32 mfp = 0; + bcm_tlv_t *wpa2_ie; + u8 rsn_cap[2]; +#endif /* MFP */ + #ifdef BCMWAPI_WPI s32 val = 0; #endif @@ -3102,8 +3359,46 @@ wl_set_set_cipher(struct net_device *dev, struct cfg80211_connect_params *sme) } else { #endif WL_DBG((" NO, is_wps_conn, Set pval | gval to WSEC")); + wsec_val = pval | gval; + +#ifdef MFP + if (pval == AES_ENABLED) { + if (((wpa2_ie = bcm_parse_tlvs((u8 *)sme->ie, sme->ie_len, + DOT11_MNG_RSN_ID)) != NULL) && + (wl_cfg80211_get_rsn_capa(wpa2_ie, rsn_cap) == 0)) { + + if (rsn_cap[0] & RSN_CAP_MFPC) { + /* MFP Capability advertised by supplicant. Check + * whether MFP is supported in the firmware + */ + if ((err = wldev_iovar_getint_bsscfg(dev, + "mfp", &mfp, bssidx)) < 0) { + WL_ERR(("Get MFP failed! " + "Check MFP support in FW \n")); + return -1; + } + + if ((sme->crypto.n_akm_suites == 1) && + ((sme->crypto.akm_suites[0] == + WL_AKM_SUITE_MFP_PSK) || + (sme->crypto.akm_suites[0] == + WL_AKM_SUITE_MFP_1X))) { + wsec_val |= MFP_SHA256; + } else if (sme->crypto.n_akm_suites > 1) { + WL_ERR(("Multiple AKM Specified \n")); + return -EINVAL; + } + + wsec_val |= MFP_CAPABLE; + if (rsn_cap[0] & RSN_CAP_MFPR) + wsec_val |= MFP_REQUIRED; + } + } + } +#endif /* MFP */ + WL_DBG((" Set WSEC to fW 0x%x \n", wsec_val)); err = wldev_iovar_setint_bsscfg(dev, "wsec", - pval | gval, bssidx); + wsec_val, bssidx); #ifdef BCMWAPI_WPI } #endif @@ -3170,6 +3465,14 @@ wl_set_key_mgmt(struct net_device *dev, struct cfg80211_connect_params *sme) case WLAN_AKM_SUITE_8021X: val = WPA2_AUTH_UNSPECIFIED; break; +#ifdef MFP + case WL_AKM_SUITE_MFP_1X: + val = WPA2_AUTH_UNSPECIFIED; + break; + case WL_AKM_SUITE_MFP_PSK: + val = WPA2_AUTH_PSK; + break; +#endif case WLAN_AKM_SUITE_PSK: val = WPA2_AUTH_PSK; break; @@ -3330,6 +3633,7 @@ wl_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev, size_t join_params_size; #if defined(ROAM_ENABLE) && defined(ROAM_AP_ENV_DETECTION) dhd_pub_t *dhd = (dhd_pub_t *)(wl->pub); + s32 roam_trigger[2] = {0, 0}; #endif /* ROAM_AP_ENV_DETECTION */ s32 err = 0; wpa_ie_fixed_t *wpa_ie; @@ -3368,6 +3672,11 @@ wl_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev, wl_notify_escan_complete(wl, dev, true, true); } #endif +#ifdef WL_SCHED_SCAN + if (wl->sched_scan_req) { + wl_cfg80211_sched_scan_stop(wiphy, wl_to_prmry_ndev(wl)); + } +#endif #ifdef WL_CFG80211_GON_COLLISION /* init block gon req count */ wl->block_gon_req_tx_count = 0; @@ -3380,7 +3689,9 @@ wl_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev, bzero(connect_req_bssid, ETHER_ADDR_LEN); bzero(broad_bssid, ETHER_ADDR_LEN); #endif - +#if defined(USE_DYNAMIC_MAXPKT_RXGLOM) + maxrxpktglom = 0; +#endif bzero(&bssid, sizeof(bssid)); if (!wl_get_drv_status(wl, CONNECTED, dev)&& (ret = wldev_ioctl(dev, WLC_GET_BSSID, &bssid, ETHER_ADDR_LEN, false)) == 0) { @@ -3465,16 +3776,29 @@ wl_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev, } } #if defined(ROAM_ENABLE) && defined(ROAM_AP_ENV_DETECTION) - if (dhd->roam_env_detection && (wldev_iovar_setint(dev, "roam_env_detection", - AP_ENV_DETECT_NOT_USED) == BCME_OK)) { - s32 roam_trigger[2] = {WL_AUTO_ROAM_TRIGGER, WLC_BAND_ALL}; - err = wldev_ioctl(dev, WLC_SET_ROAM_TRIGGER, roam_trigger, - sizeof(roam_trigger), true); - if (unlikely(err)) { - WL_ERR((" failed to restore roam_trigger for auto env detection\n")); + if (dhd->roam_env_detection) { + bool is_roamtrig_reset = TRUE; + bool is_roam_env_ok = (wldev_iovar_setint(dev, "roam_env_detection", + AP_ENV_DETECT_NOT_USED) == BCME_OK); +#ifdef CUSTOMER_HW4 + roam_trigger[1] = WLC_BAND_2G; + is_roamtrig_reset = + (wldev_ioctl(dev, WLC_GET_ROAM_TRIGGER, roam_trigger, + sizeof(roam_trigger), 0) == BCME_OK) && + (roam_trigger[0] == WL_AUTO_ROAM_TRIGGER-10); +#endif /* CUSTOMER_HW4 */ + if (is_roamtrig_reset && is_roam_env_ok) { + roam_trigger[0] = WL_AUTO_ROAM_TRIGGER; + roam_trigger[1] = WLC_BAND_ALL; + err = wldev_ioctl(dev, WLC_SET_ROAM_TRIGGER, roam_trigger, + sizeof(roam_trigger), true); + if (unlikely(err)) { + WL_ERR((" failed to restore roam_trigger for auto env" + " detection\n")); + } } } -#endif /* ROAM_AP_ENV_DETECTION */ +#endif /* ROAM_ENABLE && ROAM_AP_ENV_DETECTION */ if (chan) { #if defined(CUSTOMER_HW4) && defined(ROAM_CHANNEL_CACHE) wlc_ssid_t ssid; @@ -3564,14 +3888,14 @@ wl_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev, wl_update_prof(wl, dev, NULL, &ext_join_params->ssid, WL_PROF_SSID); ext_join_params->ssid.SSID_len = htod32(ext_join_params->ssid.SSID_len); /* increate dwell time to receive probe response or detect Beacon - * from target AP at a noisy air only during connect command + * from target AP at a noisy air only when channel info is provided in connect command */ - ext_join_params->scan.active_time = WL_SCAN_JOIN_ACTIVE_DWELL_TIME_MS; - ext_join_params->scan.passive_time = WL_SCAN_JOIN_PASSIVE_DWELL_TIME_MS; + ext_join_params->scan.active_time = chan_cnt ? WL_SCAN_JOIN_ACTIVE_DWELL_TIME_MS : -1; + ext_join_params->scan.passive_time = chan_cnt ? WL_SCAN_JOIN_PASSIVE_DWELL_TIME_MS : -1; /* Set up join scan parameters */ ext_join_params->scan.scan_type = -1; - ext_join_params->scan.nprobes - = (ext_join_params->scan.active_time/WL_SCAN_JOIN_PROBE_INTERVAL_MS); + ext_join_params->scan.nprobes = chan_cnt ? + (ext_join_params->scan.active_time/WL_SCAN_JOIN_PROBE_INTERVAL_MS) : -1; ext_join_params->scan.home_time = -1; if (sme->bssid) @@ -3622,8 +3946,10 @@ wl_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev, if (err == BCME_UNSUPPORTED) { WL_DBG(("join iovar is not supported\n")); goto set_ssid; - } else + } else { WL_ERR(("error (%d)\n", err)); + goto exit; + } } else goto exit; @@ -3696,9 +4022,15 @@ wl_cfg80211_disconnect(struct wiphy *wiphy, struct net_device *dev, return err; } +#if defined(WL_CFG80211_P2P_DEV_IF) +static s32 +wl_cfg80211_set_tx_power(struct wiphy *wiphy, struct wireless_dev *wdev, + enum nl80211_tx_power_setting type, s32 mbm) +#else static s32 wl_cfg80211_set_tx_power(struct wiphy *wiphy, enum nl80211_tx_power_setting type, s32 dbm) +#endif /* WL_CFG80211_P2P_DEV_IF */ { struct wl_priv *wl = wiphy_priv(wiphy); @@ -3707,9 +4039,12 @@ wl_cfg80211_set_tx_power(struct wiphy *wiphy, s32 err = 0; s32 disable = 0; s32 txpwrqdbm; -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 3, 0)) || defined(WL_COMPAT_WIRELESS) +#if defined(WL_CFG80211_P2P_DEV_IF) + s32 dbm = MBM_TO_DBM(mbm); +#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 3, 0)) || \ + defined(WL_COMPAT_WIRELESS) || defined(WL_SUPPORT_BACKPORTED_KPATCHES) dbm = MBM_TO_DBM(dbm); -#endif /* KERNEL_VERSION >= 3.3.0 || WL_COMPAT_WIRELESS */ +#endif /* WL_CFG80211_P2P_DEV_IF */ RETURN_EIO_IF_NOT_UP(wl); switch (type) { @@ -3746,7 +4081,7 @@ wl_cfg80211_set_tx_power(struct wiphy *wiphy, if (type == NL80211_TX_POWER_AUTOMATIC) txpwrqdbm = 127; else - txpwrqdbm |= WL_TXPWR_OVERRIDE; + txpwrqdbm |= WL_TXPWR_OVERRIDE; #endif /* SUPPORT_WL_TXPOWER */ err = wldev_iovar_setint(ndev, "qtxpower", txpwrqdbm); if (unlikely(err)) { @@ -3758,7 +4093,12 @@ wl_cfg80211_set_tx_power(struct wiphy *wiphy, return err; } +#if defined(WL_CFG80211_P2P_DEV_IF) +static s32 wl_cfg80211_get_tx_power(struct wiphy *wiphy, + struct wireless_dev *wdev, s32 *dbm) +#else static s32 wl_cfg80211_get_tx_power(struct wiphy *wiphy, s32 *dbm) +#endif /* WL_CFG80211_P2P_DEV_IF */ { struct wl_priv *wl = wiphy_priv(wiphy); struct net_device *ndev = wl_to_prmry_ndev(wl); @@ -4177,7 +4517,7 @@ wl_cfg80211_get_station(struct wiphy *wiphy, struct net_device *dev, s32 rate; s32 err = 0; sta_info_t *sta; -#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 0, 0) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 0, 0)) || defined(WL_COMPAT_WIRELESS) s8 eabuf[ETHER_ADDR_STR_LEN]; #endif dhd_pub_t *dhd = (dhd_pub_t *)(wl->pub); @@ -4197,7 +4537,7 @@ wl_cfg80211_get_station(struct wiphy *wiphy, struct net_device *dev, sta->idle = dtoh32(sta->idle); sta->in = dtoh32(sta->in); sinfo->inactive_time = sta->idle * 1000; -#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 0, 0) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 0, 0)) || defined(WL_COMPAT_WIRELESS) if (sta->flags & WL_STA_ASSOC) { sinfo->filled |= STATION_INFO_CONNECTED_TIME; sinfo->connected_time = sta->in; @@ -4228,10 +4568,28 @@ wl_cfg80211_get_station(struct wiphy *wiphy, struct net_device *dev, if (err) { WL_ERR(("Could not get rate (%d)\n", err)); } else { +#if defined(USE_DYNAMIC_MAXPKT_RXGLOM) + int rxpktglom; +#endif rate = dtoh32(rate); sinfo->filled |= STATION_INFO_TX_BITRATE; sinfo->txrate.legacy = rate * 5; WL_DBG(("Rate %d Mbps\n", (rate / 2))); +#if defined(USE_DYNAMIC_MAXPKT_RXGLOM) + rxpktglom = ((rate/2) > 150) ? 20 : 10; + + if (maxrxpktglom != rxpktglom) { + maxrxpktglom = rxpktglom; + WL_DBG(("Rate %d Mbps, update bus:maxtxpktglom=%d\n", (rate/2), + maxrxpktglom)); + err = wldev_iovar_setbuf(dev, "bus:maxtxpktglom", + (char*)&maxrxpktglom, 4, wl->ioctl_buf, + WLC_IOCTL_MAXLEN, NULL); + if (err < 0) { + WL_ERR(("set bus:maxtxpktglom failed, %d\n", err)); + } + } +#endif } memset(&scb_val, 0, sizeof(scb_val)); @@ -4242,7 +4600,7 @@ wl_cfg80211_get_station(struct wiphy *wiphy, struct net_device *dev, WL_ERR(("Could not get rssi (%d)\n", err)); goto get_station_err; } - rssi = dtoh32(scb_val.val) + RSSI_OFFSET; + rssi = wl_rssi_offset(dtoh32(scb_val.val)); sinfo->filled |= STATION_INFO_SIGNAL; sinfo->signal = rssi; WL_DBG(("RSSI %d dBm\n", rssi)); @@ -4274,6 +4632,24 @@ wl_cfg80211_get_station(struct wiphy *wiphy, struct net_device *dev, return err; } +/* Function to update sta power save mode for Kernel wifi stack */ +int wl_cfg80211_update_power_mode(struct net_device *dev) +{ + int pm = -1; + int err; + + err = wldev_ioctl(dev, WLC_GET_PM, &pm, sizeof(pm), false); + if (err || (pm == -1)) { + WL_ERR(("error (%d)\n", err)); + } else { + pm = (pm == PM_OFF) ? false : true; + WL_DBG(("%s: %d\n", __func__, pm)); + if (dev->ieee80211_ptr) + dev->ieee80211_ptr->ps = pm; + } + return err; +} + static s32 wl_cfg80211_set_power_mgmt(struct wiphy *wiphy, struct net_device *dev, bool enabled, s32 timeout) @@ -4282,21 +4658,31 @@ wl_cfg80211_set_power_mgmt(struct wiphy *wiphy, struct net_device *dev, s32 err = 0; struct wl_priv *wl = wiphy_priv(wiphy); struct net_info *_net_info = wl_get_netinfo_by_netdev(wl, dev); - +#if !defined(SUPPORT_PM2_ONLY) + dhd_pub_t *dhd = (dhd_pub_t *)(wl->pub); +#endif /* (OEM_ANDROID) */ RETURN_EIO_IF_NOT_UP(wl); WL_DBG(("Enter\n")); +#if defined(WL_ENABLE_P2P_IF) if (wl->p2p_net == dev || _net_info == NULL || wl->vsdb_mode || !wl_get_drv_status(wl, CONNECTED, dev)) { +#else + if (_net_info == NULL || wl->vsdb_mode || + !wl_get_drv_status(wl, CONNECTED, dev)) { +#endif /* WL_ENABLE_P2P_IF */ return err; } + WL_DBG(("%s: Enter power save enabled %d\n", dev->name, enabled)); /* Delete pm_enable_work */ -#ifdef CUSTOMER_HW4 - if (enabled) -#endif /* CUSTOMER_HW4 */ - wl_add_remove_pm_enable_work(wl, FALSE, WL_HANDLER_PEND); + wl_add_remove_pm_enable_work(wl, FALSE, WL_HANDLER_PEND); +#if !defined(SUPPORT_PM2_ONLY) + /* android has special hooks to change pm when kernel suspended */ + pm = enabled ? ((dhd->in_suspend) ? PM_MAX : PM_FAST) : PM_OFF; +#else pm = enabled ? PM_FAST : PM_OFF; +#endif /* SUPPORT_PM2_ONLY */ if (_net_info->pm_block) { WL_ERR(("%s:Do not enable the power save for pm_block %d\n", dev->name, _net_info->pm_block)); @@ -4358,7 +4744,7 @@ static s32 wl_cfg80211_resume(struct wiphy *wiphy) return err; } -#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 39) +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 39)) || defined(WL_COMPAT_WIRELESS) static s32 wl_cfg80211_suspend(struct wiphy *wiphy, struct cfg80211_wowlan *wow) #else static s32 wl_cfg80211_suspend(struct wiphy *wiphy) @@ -4569,30 +4955,31 @@ wl_cfg80211_scan_alloc_params(int channel, int nprobes, int *out_params_size) return params; } +#if defined(WL_CFG80211_P2P_DEV_IF) static s32 -wl_cfg80211_remain_on_channel(struct wiphy *wiphy, struct net_device *dev, +wl_cfg80211_remain_on_channel(struct wiphy *wiphy, bcm_struct_cfgdev *cfgdev, + struct ieee80211_channel *channel, unsigned int duration, u64 *cookie) +#else +static s32 +wl_cfg80211_remain_on_channel(struct wiphy *wiphy, bcm_struct_cfgdev *cfgdev, struct ieee80211_channel * channel, enum nl80211_channel_type channel_type, unsigned int duration, u64 *cookie) +#endif /* WL_CFG80211_P2P_DEV_IF */ { s32 target_channel; u32 id; + s32 err = BCME_OK; struct ether_addr primary_mac; struct net_device *ndev = NULL; + struct wl_priv *wl = wiphy_priv(wiphy); - s32 err = BCME_OK; - struct wl_priv *wl = wiphy_priv(wiphy); + ndev = cfgdev_to_wlc_ndev(cfgdev, wl); - WL_DBG(("Enter, ifindex: %d, channel: %d, duration ms (%d) SCANNING ?? %s \n", - dev->ifindex, ieee80211_frequency_to_channel(channel->center_freq), + WL_DBG(("Enter, channel: %d, duration ms (%d) SCANNING ?? %s \n", + ieee80211_frequency_to_channel(channel->center_freq), duration, (wl_get_drv_status(wl, SCANNING, ndev)) ? "YES":"NO")); - if (wl->p2p_net == dev) { - ndev = wl_to_prmry_ndev(wl); - } else { - ndev = dev; - } - if (!wl->p2p) { WL_ERR(("wl->p2p is not initialized\n")); err = BCME_ERROR; @@ -4607,7 +4994,9 @@ wl_cfg80211_remain_on_channel(struct wiphy *wiphy, struct net_device *dev, target_channel = ieee80211_frequency_to_channel(channel->center_freq); memcpy(&wl->remain_on_chan, channel, sizeof(struct ieee80211_channel)); +#if defined(WL_ENABLE_P2P_IF) wl->remain_on_chan_type = channel_type; +#endif /* WL_ENABLE_P2P_IF */ id = ++wl->last_roc_id; if (id == 0) id = ++wl->last_roc_id; @@ -4686,8 +5075,13 @@ wl_cfg80211_remain_on_channel(struct wiphy *wiphy, struct net_device *dev, exit: if (err == BCME_OK) { WL_INFO(("Success\n")); - cfg80211_ready_on_channel(dev, *cookie, channel, +#if defined(WL_CFG80211_P2P_DEV_IF) + cfg80211_ready_on_channel(cfgdev, *cookie, channel, + duration, GFP_KERNEL); +#else + cfg80211_ready_on_channel(cfgdev, *cookie, channel, channel_type, duration, GFP_KERNEL); +#endif /* WL_CFG80211_P2P_DEV_IF */ } else { WL_ERR(("Fail to Set (err=%d cookie:%llu)\n", err, *cookie)); } @@ -4695,11 +5089,18 @@ wl_cfg80211_remain_on_channel(struct wiphy *wiphy, struct net_device *dev, } static s32 -wl_cfg80211_cancel_remain_on_channel(struct wiphy *wiphy, struct net_device *dev, - u64 cookie) +wl_cfg80211_cancel_remain_on_channel(struct wiphy *wiphy, + bcm_struct_cfgdev *cfgdev, u64 cookie) { s32 err = 0; - WL_DBG((" enter ) netdev_ifidx: %d \n", dev->ifindex)); + +#if defined(WL_CFG80211_P2P_DEV_IF) + if (cfgdev->iftype == NL80211_IFTYPE_P2P_DEVICE) { + WL_DBG((" enter ) on P2P dedicated discover interface\n")); + } +#else + WL_DBG((" enter ) netdev_ifidx: %d \n", cfgdev->ifindex)); +#endif /* WL_CFG80211_P2P_DEV_IF */ return err; } @@ -4714,7 +5115,7 @@ wl_cfg80211_afx_handler(struct work_struct *work) if (afx_instance != NULL && wl->afx_hdl->is_active) { if (wl->afx_hdl->is_listen && wl->afx_hdl->my_listen_chan) { ret = wl_cfgp2p_discover_listen(wl, wl->afx_hdl->my_listen_chan, - (100 * (1 + (random32() % 3)))); /* 100ms ~ 300ms */ + (100 * (1 + (RANDOM32() % 3)))); /* 100ms ~ 300ms */ } else { ret = wl_cfgp2p_act_frm_search(wl, wl->afx_hdl->dev, wl->afx_hdl->bssidx, wl->afx_hdl->peer_listen_chan, @@ -4732,6 +5133,9 @@ static s32 wl_cfg80211_af_searching_channel(struct wl_priv *wl, struct net_device *dev) { u32 max_retry = WL_CHANNEL_SYNC_RETRY; +#ifdef CUSTOMER_HW4 + bool is_p2p_gas = false; +#endif /* CUSTOMER_HW4 */ if (dev == NULL) return -1; @@ -4740,6 +5144,14 @@ wl_cfg80211_af_searching_channel(struct wl_priv *wl, struct net_device *dev) wl_set_drv_status(wl, FINDING_COMMON_CHANNEL, dev); wl->afx_hdl->is_active = TRUE; +#ifdef CUSTOMER_HW4 + if (wl->afx_hdl->pending_tx_act_frm) { + wl_action_frame_t *action_frame; + action_frame = &(wl->afx_hdl->pending_tx_act_frm->action_frame); + if (wl_cfgp2p_is_p2p_gas_action(action_frame->data, action_frame->len)) + is_p2p_gas = true; + } +#endif /* CUSTOMER_HW4 */ /* Loop to wait until we find a peer's channel or the * pending action frame tx is cancelled. @@ -4758,18 +5170,22 @@ wl_cfg80211_af_searching_channel(struct wl_priv *wl, struct net_device *dev) if ((wl->afx_hdl->peer_chan != WL_INVALID) || !(wl_get_drv_status(wl, FINDING_COMMON_CHANNEL, dev))) break; +#ifdef CUSTOMER_HW4 + if (is_p2p_gas) + break; +#endif /* CUSTOMER_HW4 */ if (wl->afx_hdl->my_listen_chan) { WL_DBG(("Scheduling Listen peer in my listen channel = %d\n", wl->afx_hdl->my_listen_chan)); /* listen on my listen channel */ wl->afx_hdl->is_listen = TRUE; - schedule_work(&wl->afx_hdl->work); + schedule_work(&wl->afx_hdl->work); wait_for_completion_timeout(&wl->act_frm_scan, msecs_to_jiffies(WL_AF_SEARCH_TIME_MAX)); } if ((wl->afx_hdl->peer_chan != WL_INVALID) || - !wl_get_drv_status(wl, FINDING_COMMON_CHANNEL, dev)) + !(wl_get_drv_status(wl, FINDING_COMMON_CHANNEL, dev))) break; wl->afx_hdl->retry++; @@ -4844,7 +5260,6 @@ wl_cfg80211_config_p2p_pub_af_tx(struct wiphy *wiphy, wl->next_af_subtype = act_frm->subtype + 1; /* increase dwell time to wait for CONF frame */ af_params->dwell_time = WL_MED_DWELL_TIME + 100; - break; } case P2P_PAF_GON_CONF: { @@ -4884,7 +5299,10 @@ wl_cfg80211_config_p2p_pub_af_tx(struct wiphy *wiphy, #endif /* WL_CFG80211_SYNC_GON */ break; case P2P_PAF_DEVDIS_REQ: { - config_af_params->search_channel = true; + if (IS_ACTPUB_WITHOUT_GROUP_ID(&act_frm->elts[0], + action_frame->len)) { + config_af_params->search_channel = true; + } wl->next_af_subtype = act_frm->subtype + 1; /* maximize dwell time to wait for RESP frame */ @@ -4899,7 +5317,7 @@ wl_cfg80211_config_p2p_pub_af_tx(struct wiphy *wiphy, #endif /* WL_CFG80211_SYNC_GON */ break; case P2P_PAF_PROVDIS_REQ: { - if (IS_PROV_DISC_WITHOUT_GROUP_ID(&act_frm->elts[0], + if (IS_ACTPUB_WITHOUT_GROUP_ID(&act_frm->elts[0], action_frame->len)) { config_af_params->search_channel = true; } @@ -4912,7 +5330,6 @@ wl_cfg80211_config_p2p_pub_af_tx(struct wiphy *wiphy, } case P2P_PAF_PROVDIS_RSP: { wl->next_af_subtype = P2P_PAF_GON_REQ; - /* increase dwell time to MED level */ af_params->dwell_time = WL_MIN_DWELL_TIME; #ifdef WL_CFG80211_SYNC_GON config_af_params->extra_listen = false; @@ -4927,7 +5344,7 @@ wl_cfg80211_config_p2p_pub_af_tx(struct wiphy *wiphy, return err; } - +#ifdef WL11U static bool wl_cfg80211_check_DFS_channel(struct wl_priv *wl, wl_af_params_t *af_params, void *frame, u16 frame_len) @@ -4936,7 +5353,6 @@ wl_cfg80211_check_DFS_channel(struct wl_priv *wl, wl_af_params_t *af_params, struct wl_bss_info *bi = NULL; bool result = false; s32 i; - chanspec_t chanspec; /* If DFS channel is 52~148, check to block it or not */ if (af_params && @@ -4945,14 +5361,11 @@ wl_cfg80211_check_DFS_channel(struct wl_priv *wl, wl_af_params_t *af_params, bss_list = wl->bss_list; bi = next_bss(bss_list, bi); for_each_bss(bss_list, bi, i) { - if (memcmp((char *)&bi->BSSID, - (char *)&af_params->BSSID, ETHER_ADDR_LEN) == 0) { - chanspec = bi->chanspec; - if (CHSPEC_IS5G(chanspec) && - CHSPEC_CHANNEL(chanspec) == af_params->channel) { - result = true; /* do not block the action frame */ - break; - } + if (CHSPEC_IS5G(bi->chanspec) && + ((bi->ctl_ch ? bi->ctl_ch : CHSPEC_CHANNEL(bi->chanspec)) + == af_params->channel)) { + result = true; /* do not block the action frame */ + break; } } } @@ -4964,13 +5377,17 @@ wl_cfg80211_check_DFS_channel(struct wl_priv *wl, wl_af_params_t *af_params, WL_DBG(("result=%s", result?"true":"false")); return result; } +#endif /* WL11U */ static bool wl_cfg80211_send_action_frame(struct wiphy *wiphy, struct net_device *dev, - struct net_device *ndev, wl_af_params_t *af_params, + bcm_struct_cfgdev *cfgdev, wl_af_params_t *af_params, wl_action_frame_t *action_frame, u16 action_frame_len, s32 bssidx) { +#ifdef WL11U + struct net_device *ndev = NULL; +#endif /* WL11U */ struct wl_priv *wl = wiphy_priv(wiphy); bool ack = false; u8 category, action; @@ -4981,6 +5398,13 @@ wl_cfg80211_send_action_frame(struct wiphy *wiphy, struct net_device *dev, #endif dhd_pub_t *dhd = (dhd_pub_t *)(wl->pub); +#ifdef WL11U +#if defined(WL_CFG80211_P2P_DEV_IF) + ndev = dev; +#else + ndev = ndev_to_cfgdev(cfgdev); +#endif /* WL_CFG80211_P2P_DEV_IF */ +#endif /* WL11U */ category = action_frame->data[DOT11_ACTION_CAT_OFF]; action = action_frame->data[DOT11_ACTION_ACT_OFF]; @@ -5082,10 +5506,12 @@ wl_cfg80211_send_action_frame(struct wiphy *wiphy, struct net_device *dev, wl_notify_escan_complete(wl, wl->escan_info.ndev, true, true); } +#ifdef WL11U /* handling DFS channel exceptions */ if (!wl_cfg80211_check_DFS_channel(wl, af_params, action_frame->data, action_frame->len)) { return false; /* the action frame was blocked */ } +#endif /* WL11U */ /* set status and destination address before sending af */ if (wl->next_af_subtype != P2P_PAF_SUBTYPE_INVALID) { @@ -5118,14 +5544,16 @@ wl_cfg80211_send_action_frame(struct wiphy *wiphy, struct net_device *dev, goto exit; } + wl_clr_drv_status(wl, SCANNING, wl->afx_hdl->dev); + /* + * Abort scan even for VSDB scenarios. Scan gets aborted in firmware + * but after the check of piggyback algorithm. + * To take care of current piggback algo, lets abort the scan here itself. + */ + wl_notify_escan_complete(wl, dev, true, true); /* Suspend P2P discovery's search-listen to prevent it from * starting a scan or changing the channel. */ - wl_clr_drv_status(wl, SCANNING, wl->afx_hdl->dev); -/* Do not abort scan for VSDB. Scan will be aborted in firmware if necessary */ -#ifndef WL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST - wl_notify_escan_complete(wl, dev, true, true); -#endif /* not WL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST */ wl_cfgp2p_discover_enable_search(wl, false); /* update channel */ @@ -5149,9 +5577,8 @@ wl_cfg80211_send_action_frame(struct wiphy *wiphy, struct net_device *dev, OFF_CHAN_TIME_THRESHOLD_MS) { WL_AF_TX_KEEP_PRI_CONNECTION_VSDB(wl); off_chan_started_jiffies = jiffies; - } - else - OSL_SLEEP(40); + } else + OSL_SLEEP(AF_RETRY_DELAY_TIME); } #endif /* VSDB */ ack = wl_cfgp2p_tx_action_frame(wl, dev, af_params, bssidx) ? @@ -5221,19 +5648,27 @@ wl_cfg80211_send_action_frame(struct wiphy *wiphy, struct net_device *dev, } #define MAX_NUM_OF_ASSOCIATED_DEV 64 +#if defined(WL_CFG80211_P2P_DEV_IF) +static s32 +wl_cfg80211_mgmt_tx(struct wiphy *wiphy, bcm_struct_cfgdev *cfgdev, + struct ieee80211_channel *channel, bool offchan, + unsigned int wait, const u8* buf, size_t len, bool no_cck, + bool dont_wait_for_ack, u64 *cookie) +#else static s32 -wl_cfg80211_mgmt_tx(struct wiphy *wiphy, struct net_device *ndev, +wl_cfg80211_mgmt_tx(struct wiphy *wiphy, bcm_struct_cfgdev *cfgdev, struct ieee80211_channel *channel, bool offchan, enum nl80211_channel_type channel_type, bool channel_type_valid, unsigned int wait, const u8* buf, size_t len, -#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 2, 0) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 2, 0)) || defined(WL_COMPAT_WIRELESS) bool no_cck, #endif -#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 3, 0) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 3, 0)) || defined(WL_COMPAT_WIRELESS) bool dont_wait_for_ack, #endif u64 *cookie) +#endif /* WL_CFG80211_P2P_DEV_IF */ { wl_action_frame_t *action_frame; wl_af_params_t *af_params; @@ -5249,16 +5684,11 @@ wl_cfg80211_mgmt_tx(struct wiphy *wiphy, struct net_device *ndev, WL_DBG(("Enter \n")); - if (ndev == wl->p2p_net) { - dev = wl_to_prmry_ndev(wl); - } else { - /* If TX req is for any valid ifidx. Use as is */ - dev = ndev; - } + dev = cfgdev_to_wlc_ndev(cfgdev, wl); - /* find bssidx based on ndev */ + /* find bssidx based on dev */ if (wl_cfgp2p_find_idx(wl, dev, &bssidx) != BCME_OK) { - WL_ERR(("Find p2p index from ndev(%p) failed\n", dev)); + WL_ERR(("Find p2p index from dev(%p) failed\n", dev)); return BCME_ERROR; } if (p2p_is_on(wl)) { @@ -5284,7 +5714,7 @@ wl_cfg80211_mgmt_tx(struct wiphy *wiphy, struct net_device *ndev, bssidx = wl_to_p2p_bss_bssidx(wl, P2PAPI_BSSCFG_DEVICE); wl_cfgp2p_set_management_ie(wl, dev, bssidx, VNDR_IE_PRBRSP_FLAG, (u8 *)(buf + ie_offset), ie_len); - cfg80211_mgmt_tx_status(ndev, *cookie, buf, len, true, GFP_KERNEL); + cfg80211_mgmt_tx_status(cfgdev, *cookie, buf, len, true, GFP_KERNEL); goto exit; } else if (ieee80211_is_disassoc(mgmt->frame_control) || ieee80211_is_deauth(mgmt->frame_control)) { @@ -5295,7 +5725,7 @@ wl_cfg80211_mgmt_tx(struct wiphy *wiphy, struct net_device *ndev, if (!bcmp((const uint8 *)BSSID_BROADCAST, (const struct ether_addr *)mgmt->da, ETHER_ADDR_LEN)) { assoc_maclist->count = MAX_NUM_OF_ASSOCIATED_DEV; - err = wldev_ioctl(ndev, WLC_GET_ASSOCLIST, + err = wldev_ioctl(dev, WLC_GET_ASSOCLIST, assoc_maclist, sizeof(mac_buf), false); if (err < 0) WL_ERR(("WLC_GET_ASSOCLIST error %d\n", err)); @@ -5315,7 +5745,7 @@ wl_cfg80211_mgmt_tx(struct wiphy *wiphy, struct net_device *ndev, if (num_associated > 0 && ETHER_ISBCAST(mgmt->da)) wl_delay(400); - cfg80211_mgmt_tx_status(ndev, *cookie, buf, len, true, GFP_KERNEL); + cfg80211_mgmt_tx_status(cfgdev, *cookie, buf, len, true, GFP_KERNEL); goto exit; } else if (ieee80211_is_action(mgmt->frame_control)) { @@ -5376,10 +5806,9 @@ wl_cfg80211_mgmt_tx(struct wiphy *wiphy, struct net_device *ndev, memcpy(action_frame->data, &buf[DOT11_MGMT_HDR_LEN], action_frame->len); - ack = wl_cfg80211_send_action_frame(wiphy, dev, ndev, af_params, + ack = wl_cfg80211_send_action_frame(wiphy, dev, cfgdev, af_params, action_frame, action_frame->len, bssidx); - - cfg80211_mgmt_tx_status(ndev, *cookie, buf, len, ack, GFP_KERNEL); + cfg80211_mgmt_tx_status(cfgdev, *cookie, buf, len, ack, GFP_KERNEL); kfree(af_params); exit: @@ -5388,7 +5817,7 @@ wl_cfg80211_mgmt_tx(struct wiphy *wiphy, struct net_device *ndev, static void -wl_cfg80211_mgmt_frame_register(struct wiphy *wiphy, struct net_device *dev, +wl_cfg80211_mgmt_frame_register(struct wiphy *wiphy, bcm_struct_cfgdev *cfgdev, u16 frame_type, bool reg) { @@ -5406,6 +5835,8 @@ wl_cfg80211_change_bss(struct wiphy *wiphy, struct net_device *dev, struct bss_parameters *params) { + s32 err = 0; + s32 ap_isolate = 0; if (params->use_cts_prot >= 0) { } @@ -5419,6 +5850,12 @@ wl_cfg80211_change_bss(struct wiphy *wiphy, } if (params->ap_isolate >= 0) { + ap_isolate = params->ap_isolate; + err = wldev_iovar_setint(dev, "ap_isolate", ap_isolate); + if (unlikely(err)) + { + WL_ERR(("set ap_isolate Error (%d)\n", err)); + } } if (params->ht_opmode >= 0) { @@ -5445,9 +5882,7 @@ wl_cfg80211_set_channel(struct wiphy *wiphy, struct net_device *dev, } param = {0, 0}; struct wl_priv *wl = wiphy_priv(wiphy); - if (wl->p2p_net == dev) { - dev = wl_to_prmry_ndev(wl); - } + dev = ndev_to_wlc_ndev(dev, wl); _chan = ieee80211_frequency_to_channel(chan->center_freq); WL_ERR(("netdev_ifidx(%d), chan_type(%d) target channel(%d) \n", dev->ifindex, channel_type, _chan)); @@ -5866,6 +6301,7 @@ wl_cfg80211_bcn_validate_sec( WL_DBG(("SoftAP: validating security")); /* If wpa2_ie or wpa_ie is present validate it */ + if ((ies->wpa2_ie || ies->wpa_ie) && ((wl_validate_wpa2ie(dev, ies->wpa2_ie, bssidx) < 0 || wl_validate_wpaie(dev, ies->wpa_ie, bssidx) < 0))) { @@ -5914,7 +6350,7 @@ wl_cfg80211_bcn_validate_sec( } -#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0)) || defined(WL_COMPAT_WIRELESS) static s32 wl_cfg80211_bcn_set_params( struct cfg80211_ap_settings *info, struct net_device *dev, @@ -5966,7 +6402,7 @@ static s32 wl_cfg80211_bcn_set_params( return err; } -#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0) */ +#endif /* LINUX_VERSION >= VERSION(3,4,0) || WL_COMPAT_WIRELESS */ static s32 wl_cfg80211_parse_ies(u8 *ptr, u32 len, struct parsed_ies *ies) @@ -6102,7 +6538,7 @@ wl_cfg80211_bcn_bringup_ap( return err; } -#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0)) || defined(WL_COMPAT_WIRELESS) s32 wl_cfg80211_parse_ap_ies( struct net_device *dev, @@ -6194,7 +6630,7 @@ wl_cfg80211_set_ies( return err; } -#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0) */ +#endif /* LINUX_VERSION >= VERSION(3,4,0) || WL_COMPAT_WIRELESS */ static s32 wl_cfg80211_hostapd_sec( struct net_device *dev, @@ -6215,6 +6651,7 @@ static s32 wl_cfg80211_hostapd_sec( WL_DBG((" WPS IE is added\n")); wl->ap_info->wps_ie = kmemdup(ies->wps_ie, ies->wps_ie_len, GFP_KERNEL); } + if ((ies->wpa_ie != NULL || ies->wpa2_ie != NULL)) { if (!wl->ap_info->security_mode) { /* change from open mode to security mode */ @@ -6288,11 +6725,7 @@ wl_cfg80211_del_station( return 0; } - if (ndev == wl->p2p_net) { - dev = wl_to_prmry_ndev(wl); - } else { - dev = ndev; - } + dev = ndev_to_wlc_ndev(ndev, wl); if (p2p_is_on(wl)) { /* Suspend P2P discovery search-listen to prevent it from changing the @@ -6321,13 +6754,15 @@ wl_cfg80211_del_station( WL_ERR(("Disconnect STA : %s scb_val.val %d\n", bcm_ether_ntoa((const struct ether_addr *)mac_addr, eabuf), scb_val.val)); + if (num_associated > 0 && ETHER_ISBCAST(mac_addr)) wl_delay(400); + return 0; } #endif /* WL_SUPPORT_BACKPORTED_KPATCHES || KERNEL_VER >= KERNEL_VERSION(3, 2, 0)) */ -#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0)) || defined(WL_COMPAT_WIRELESS) static s32 wl_cfg80211_start_ap( struct wiphy *wiphy, @@ -6344,12 +6779,15 @@ wl_cfg80211_start_ap( if (dev == wl_to_prmry_ndev(wl)) { WL_DBG(("Start AP req on primary iface: Softap\n")); dev_role = NL80211_IFTYPE_AP; - } else if (dev == wl->p2p_net) { + } +#if defined(WL_ENABLE_P2P_IF) + else if (dev == wl->p2p_net) { /* Group Add request on p2p0 */ WL_DBG(("Start AP req on P2P iface: GO\n")); dev = wl_to_prmry_ndev(wl); dev_role = NL80211_IFTYPE_P2P_GO; } +#endif /* WL_ENABLE_P2P_IF */ if (wl_cfgp2p_find_idx(wl, dev, &bssidx) != BCME_OK) { WL_ERR(("Find p2p index from dev(%p) failed\n", dev)); return BCME_ERROR; @@ -6364,6 +6802,15 @@ wl_cfg80211_start_ap( if (!check_dev_role_integrity(wl, dev_role)) goto fail; +#if ((LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0)) && !defined(WL_COMPAT_WIRELESS)) + if ((err = wl_cfg80211_set_channel(wiphy, dev, + dev->ieee80211_ptr->preset_chandef.chan, + NL80211_CHAN_HT20) < 0)) { + WL_ERR(("Set channel failed \n")); + goto fail; + } +#endif /* ((LINUX_VERSION >= VERSION(3, 6, 0) && !WL_COMPAT_WIRELESS) */ + if ((err = wl_cfg80211_bcn_set_params(info, dev, dev_role, bssidx)) < 0) { WL_ERR(("Beacon params set failed \n")); @@ -6371,8 +6818,8 @@ wl_cfg80211_start_ap( } /* Parse IEs */ - if ((err = wl_cfg80211_parse_ap_ies(dev, &info->beacon, &ies)) < 0) { - WL_ERR(("Parse IEs failed \n")); + if ((err = wl_cfg80211_parse_ap_ies(dev, &info->beacon, &ies)) < 0) { + WL_ERR(("Set IEs failed \n")); goto fail; } @@ -6419,11 +6866,14 @@ wl_cfg80211_stop_ap( WL_DBG(("Enter \n")); if (dev == wl_to_prmry_ndev(wl)) { dev_role = NL80211_IFTYPE_AP; - } else if (dev == wl->p2p_net) { + } +#if defined(WL_ENABLE_P2P_IF) + else if (dev == wl->p2p_net) { /* Group Add request on p2p0 */ dev = wl_to_prmry_ndev(wl); dev_role = NL80211_IFTYPE_P2P_GO; } +#endif /* WL_ENABLE_P2P_IF */ if (wl_cfgp2p_find_idx(wl, dev, &bssidx) != BCME_OK) { WL_ERR(("Find p2p index from dev(%p) failed\n", dev)); return BCME_ERROR; @@ -6441,14 +6891,14 @@ wl_cfg80211_stop_ap( /* SoftAp on primary Interface. * Shut down AP and turn on MPC */ - err = wldev_ioctl(dev, WLC_SET_INFRA, &infra, sizeof(s32), true); - if (err < 0) { - WL_ERR(("SET INFRA error %d\n", err)); + if ((err = wldev_ioctl(dev, WLC_SET_AP, &ap, sizeof(s32), true)) < 0) { + WL_ERR(("setting AP mode failed %d \n", err)); err = -ENOTSUPP; goto exit; } - if ((err = wldev_ioctl(dev, WLC_SET_AP, &ap, sizeof(s32), true)) < 0) { - WL_ERR(("setting AP mode failed %d \n", err)); + err = wldev_ioctl(dev, WLC_SET_INFRA, &infra, sizeof(s32), true); + if (err < 0) { + WL_ERR(("SET INFRA error %d\n", err)); err = -ENOTSUPP; goto exit; } @@ -6472,6 +6922,9 @@ wl_cfg80211_stop_ap( } } else { WL_DBG(("Stopping P2P GO \n")); + DHD_OS_WAKE_LOCK_CTRL_TIMEOUT_ENABLE((dhd_pub_t *)(wl->pub), + DHD_EVENT_TIMEOUT_MS*3); + DHD_OS_WAKE_LOCK_TIMEOUT((dhd_pub_t *)(wl->pub)); } exit: @@ -6494,11 +6947,14 @@ wl_cfg80211_change_beacon( if (dev == wl_to_prmry_ndev(wl)) { dev_role = NL80211_IFTYPE_AP; - } else if (dev == wl->p2p_net) { + } +#if defined(WL_ENABLE_P2P_IF) + else if (dev == wl->p2p_net) { /* Group Add request on p2p0 */ dev = wl_to_prmry_ndev(wl); dev_role = NL80211_IFTYPE_P2P_GO; } +#endif /* WL_ENABLE_P2P_IF */ if (wl_cfgp2p_find_idx(wl, dev, &bssidx) != BCME_OK) { WL_ERR(("Find p2p index from dev(%p) failed\n", dev)); return BCME_ERROR; @@ -6553,11 +7009,14 @@ wl_cfg80211_add_set_beacon(struct wiphy *wiphy, struct net_device *dev, if (dev == wl_to_prmry_ndev(wl)) { dev_role = NL80211_IFTYPE_AP; - } else if (dev == wl->p2p_net) { + } +#if defined(WL_ENABLE_P2P_IF) + else if (dev == wl->p2p_net) { /* Group Add request on p2p0 */ dev = wl_to_prmry_ndev(wl); dev_role = NL80211_IFTYPE_P2P_GO; } +#endif /* WL_ENABLE_P2P_IF */ if (wl_cfgp2p_find_idx(wl, dev, &bssidx) != BCME_OK) { WL_ERR(("Find p2p index from dev(%p) failed\n", dev)); return BCME_ERROR; @@ -6659,13 +7118,14 @@ wl_cfg80211_add_set_beacon(struct wiphy *wiphy, struct net_device *dev, return err; } -#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(3, 4, 0) */ +#endif /* LINUX_VERSION < VERSION(3,4,0) || WL_COMPAT_WIRELESS */ #ifdef WL_SCHED_SCAN #define PNO_TIME 30 #define PNO_REPEAT 4 #define PNO_FREQ_EXPO_MAX 2 -int wl_cfg80211_sched_scan_start(struct wiphy *wiphy, +static int +wl_cfg80211_sched_scan_start(struct wiphy *wiphy, struct net_device *dev, struct cfg80211_sched_scan_request *request) { @@ -6716,17 +7176,11 @@ int wl_cfg80211_sched_scan_start(struct wiphy *wiphy, } if (ssid_count) { - if ((ret = dhd_dev_pno_set(dev, ssids_local, request->n_match_sets, - pno_time, pno_repeat, pno_freq_expo_max)) < 0) { + if ((ret = dhd_dev_pno_set_for_ssid(dev, ssids_local, request->n_match_sets, + pno_time, pno_repeat, pno_freq_expo_max, NULL, 0)) < 0) { WL_ERR(("PNO setup failed!! ret=%d \n", ret)); return -EINVAL; } - - /* Enable the PNO */ - if (dhd_dev_pno_enable(dev, 1) < 0) { - WL_ERR(("PNO enable failed!! ret=%d \n", ret)); - return -EINVAL; - } wl->sched_scan_req = request; } else { return -EINVAL; @@ -6735,18 +7189,16 @@ int wl_cfg80211_sched_scan_start(struct wiphy *wiphy, return 0; } -int wl_cfg80211_sched_scan_stop(struct wiphy *wiphy, struct net_device *dev) +static int +wl_cfg80211_sched_scan_stop(struct wiphy *wiphy, struct net_device *dev) { struct wl_priv *wl = wiphy_priv(wiphy); WL_DBG(("Enter \n")); WL_PNO((">>> SCHED SCAN STOP\n")); - if (dhd_dev_pno_enable(dev, 0) < 0) - WL_ERR(("PNO disable failed")); - - if (dhd_dev_pno_reset(dev) < 0) - WL_ERR(("PNO reset failed")); + if (dhd_dev_pno_stop_for_ssid(dev) < 0) + WL_ERR(("PNO Stop for SSID failed")); if (wl->scan_request && wl->sched_scan_running) { WL_PNO((">>> Sched scan running. Aborting it..\n")); @@ -6764,6 +7216,10 @@ static struct cfg80211_ops wl_cfg80211_ops = { .add_virtual_intf = wl_cfg80211_add_virtual_iface, .del_virtual_intf = wl_cfg80211_del_virtual_iface, .change_virtual_intf = wl_cfg80211_change_virtual_iface, +#if defined(WL_CFG80211_P2P_DEV_IF) + .start_p2p_device = wl_cfgp2p_start_p2p_device, + .stop_p2p_device = wl_cfgp2p_stop_p2p_device, +#endif /* WL_CFG80211_P2P_DEV_IF */ .scan = wl_cfg80211_scan, .set_wiphy_params = wl_cfg80211_set_wiphy_params, .join_ibss = wl_cfg80211_join_ibss, @@ -6789,15 +7245,17 @@ static struct cfg80211_ops wl_cfg80211_ops = { .mgmt_tx = wl_cfg80211_mgmt_tx, .mgmt_frame_register = wl_cfg80211_mgmt_frame_register, .change_bss = wl_cfg80211_change_bss, +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 6, 0)) || defined(WL_COMPAT_WIRELESS) .set_channel = wl_cfg80211_set_channel, -#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 4, 0) +#endif /* ((LINUX_VERSION < VERSION(3, 6, 0)) || WL_COMPAT_WIRELESS */ +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 4, 0)) && !defined(WL_COMPAT_WIRELESS) .set_beacon = wl_cfg80211_add_set_beacon, .add_beacon = wl_cfg80211_add_set_beacon, #else .change_beacon = wl_cfg80211_change_beacon, .start_ap = wl_cfg80211_start_ap, .stop_ap = wl_cfg80211_stop_ap, -#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(3, 4, 0) */ +#endif /* LINUX_VERSION < KERNEL_VERSION(3,4,0) && !WL_COMPAT_WIRELESS */ #ifdef WL_SCHED_SCAN .sched_scan_start = wl_cfg80211_sched_scan_start, .sched_scan_stop = wl_cfg80211_sched_scan_stop, @@ -6807,9 +7265,9 @@ static struct cfg80211_ops wl_cfg80211_ops = { .del_station = wl_cfg80211_del_station, .mgmt_tx_cancel_wait = wl_cfg80211_mgmt_tx_cancel_wait, #endif /* WL_SUPPORT_BACKPORTED_KPATCHES || KERNEL_VERSION >= (3,2,0) */ -#if LINUX_VERSION_CODE > KERNEL_VERSION(3, 2, 0) +#if (LINUX_VERSION_CODE > KERNEL_VERSION(3, 2, 0)) || defined(WL_COMPAT_WIRELESS) .tdls_oper = wl_cfg80211_tdls_oper -#endif /* LINUX_VERSION_CODE > KERNEL_VERSION(3, 2, 0) */ +#endif /* LINUX_VERSION > VERSION(3, 2, 0) || WL_COMPAT_WIRELESS */ }; s32 wl_mode_to_nl80211_iftype(s32 mode) @@ -6830,9 +7288,11 @@ s32 wl_mode_to_nl80211_iftype(s32 mode) return err; } -static s32 wl_setup_wiphy(struct wireless_dev *wdev, struct device *sdiofunc_dev) + +static s32 wl_setup_wiphy(struct wireless_dev *wdev, struct device *sdiofunc_dev, void *data) { s32 err = 0; + wdev->wiphy = wiphy_new(&wl_cfg80211_ops, sizeof(struct wl_priv)); if (unlikely(!wdev->wiphy)) { @@ -6854,11 +7314,26 @@ static s32 wl_setup_wiphy(struct wireless_dev *wdev, struct device *sdiofunc_dev wdev->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) | BIT(NL80211_IFTYPE_ADHOC) -#if !(defined(WLP2P) && defined(WL_ENABLE_P2P_IF)) +#if !defined(WL_ENABLE_P2P_IF) | BIT(NL80211_IFTYPE_MONITOR) -#endif +#endif /* !WL_ENABLE_P2P_IF */ +#if defined(WL_IFACE_COMB_NUM_CHANNELS) || defined(WL_CFG80211_P2P_DEV_IF) + | BIT(NL80211_IFTYPE_P2P_CLIENT) + | BIT(NL80211_IFTYPE_P2P_GO) +#endif /* WL_IFACE_COMB_NUM_CHANNELS || WL_CFG80211_P2P_DEV_IF */ +#if defined(WL_CFG80211_P2P_DEV_IF) + | BIT(NL80211_IFTYPE_P2P_DEVICE) +#endif /* WL_CFG80211_P2P_DEV_IF */ | BIT(NL80211_IFTYPE_AP); +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 0, 0)) && \ + (defined(WL_IFACE_COMB_NUM_CHANNELS) || defined(WL_CFG80211_P2P_DEV_IF)) + WL_DBG(("Setting interface combinations for common mode\n")); + wdev->wiphy->iface_combinations = common_iface_combinations; + wdev->wiphy->n_iface_combinations = + ARRAY_SIZE(common_iface_combinations); +#endif /* LINUX_VER >= 3.0 && (WL_IFACE_COMB_NUM_CHANNELS || WL_CFG80211_P2P_DEV_IF) */ + wdev->wiphy->bands[IEEE80211_BAND_2GHZ] = &__wl_band_2ghz; wdev->wiphy->signal_type = CFG80211_SIGNAL_TYPE_MBM; @@ -6873,7 +7348,7 @@ static s32 wl_setup_wiphy(struct wireless_dev *wdev, struct device *sdiofunc_dev #endif /* !WL_POWERSAVE_DISABLED */ wdev->wiphy->flags |= WIPHY_FLAG_NETNS_OK | WIPHY_FLAG_4ADDR_AP | -#if LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 39) +#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 39)) && !defined(WL_COMPAT_WIRELESS) WIPHY_FLAG_SUPPORTS_SEPARATE_DEFAULT_KEYS | #endif WIPHY_FLAG_4ADDR_STATION; @@ -6889,33 +7364,47 @@ static s32 wl_setup_wiphy(struct wireless_dev *wdev, struct device *sdiofunc_dev #if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 2, 0) /* wdev->wiphy->flags |= WIPHY_FLAG_SUPPORTS_FW_ROAM; */ #endif -#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 3, 0) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 3, 0)) || defined(WL_COMPAT_WIRELESS) wdev->wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL | WIPHY_FLAG_OFFCHAN_TX; #endif #if defined(WL_SUPPORT_BACKPORTED_KPATCHES) || (LINUX_VERSION_CODE >= KERNEL_VERSION(3, \ 4, 0)) - /* From 3.4 kernel ownards AP_SME flag can be advertised - * to remove the patch from supplicant - */ - wdev->wiphy->flags |= WIPHY_FLAG_HAVE_AP_SME; -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0)) - /* Supplicant distinguish between the SoftAP mode and other - * modes (e.g. P2P, WPS, HS2.0) when it builds the probe - * response frame from Supplicant MR1 and Kernel 3.4.0 or - * later version. To add Vendor specific IE into the - * probe response frame in case of SoftAP mode, - * AP_PROBE_RESP_OFFLOAD flag is set to wiphy->flags variable. - */ - if (strstr(fw_path, "_apsta") != NULL) { - wdev->wiphy->flags |= WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD; - wdev->wiphy->probe_resp_offload = 0; - } -#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0) */ + /* From 3.4 kernel ownards AP_SME flag can be advertised + * to remove the patch from supplicant + */ + wdev->wiphy->flags |= WIPHY_FLAG_HAVE_AP_SME; +#ifdef CUSTOMER_HW4 +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0)) || defined(WL_COMPAT_WIRELESS) + /* Supplicant distinguish between the SoftAP mode and other + * modes (e.g. P2P, WPS, HS2.0) when it builds the probe + * response frame from Supplicant MR1 and Kernel 3.4.0 or + * later version. To add Vendor specific IE into the + * probe response frame in case of SoftAP mode, + * AP_PROBE_RESP_OFFLOAD flag is set to wiphy->flags variable. + */ + if (strstr(fw_path, "_apsta") != NULL) { + wdev->wiphy->flags |= WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD; + wdev->wiphy->probe_resp_offload = 0; + } +#endif /* LINUX_VERSION >= VERSION(3,4,0) || WL_COMPAT_WIRELESS */ +#endif /* CUSTOMER_HW4 */ #endif /* WL_SUPPORT_BACKPORTED_KPATCHES) || (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0)) */ -#if LINUX_VERSION_CODE > KERNEL_VERSION(3, 2, 0) - wdev->wiphy->flags |= WIPHY_FLAG_SUPPORTS_TDLS; + + +#if (LINUX_VERSION_CODE > KERNEL_VERSION(3, 2, 0)) || defined(WL_COMPAT_WIRELESS) + wdev->wiphy->flags |= WIPHY_FLAG_SUPPORTS_TDLS; #endif + +#if defined(CONFIG_PM) && defined(WL_CFG80211_P2P_DEV_IF) + /* + * From linux-3.10 kernel, wowlan packet filter is mandated to avoid the + * disconnection of connected network before suspend. So a dummy wowlan + * filter is configured for kernels linux-3.8 and above. + */ + wdev->wiphy->wowlan.flags = WIPHY_WOWLAN_ANY; +#endif /* CONFIG_PM && WL_CFG80211_P2P_DEV_IF */ + WL_DBG(("Registering custom regulatory)\n")); wdev->wiphy->flags |= WIPHY_FLAG_CUSTOM_REGULATORY; wiphy_apply_custom_regulatory(wdev->wiphy, &brcm_regdom); @@ -6925,6 +7414,12 @@ static s32 wl_setup_wiphy(struct wireless_dev *wdev, struct device *sdiofunc_dev WL_ERR(("Couldn not register wiphy device (%d)\n", err)); wiphy_free(wdev->wiphy); } + +#if ((LINUX_VERSION_CODE >= KERNEL_VERSION(3, 0, 0)) && (LINUX_VERSION_CODE <= \ + KERNEL_VERSION(3, 3, 0))) && defined(WL_IFACE_COMB_NUM_CHANNELS) + wdev->wiphy->flags &= ~WIPHY_FLAG_ENFORCE_COMBINATIONS; +#endif /* ((LINUX_VER >= 3.0) && (LINUX_VER <= 3.3)) && WL_IFACE_COMB_NUM_CHANNELS */ + return err; } @@ -6964,7 +7459,7 @@ static s32 wl_inform_bss(struct wl_priv *wl) #if defined(CUSTOMER_HW4) && defined(ROAM_CHANNEL_CACHE) add_roam_cache(bi); #endif /* CUSTOMER_HW4 && ROAM_CHANNEL_CACHE */ - err = wl_inform_single_bss(wl, bi, 0); + err = wl_inform_single_bss(wl, bi); if (unlikely(err)) break; } @@ -6975,7 +7470,7 @@ static s32 wl_inform_bss(struct wl_priv *wl) return err; } -static s32 wl_inform_single_bss(struct wl_priv *wl, struct wl_bss_info *bi, u8 is_roam_done) +static s32 wl_inform_single_bss(struct wl_priv *wl, struct wl_bss_info *bi) { struct wiphy *wiphy = wl_to_wiphy(wl); struct ieee80211_mgmt *mgmt; @@ -6990,7 +7485,6 @@ static s32 wl_inform_single_bss(struct wl_priv *wl, struct wl_bss_info *bi, u8 i u32 freq; s32 err = 0; gfp_t aflags; - u8 *ie_offset = NULL; if (unlikely(dtoh32(bi->length) > WL_BSS_INFO_MAX)) { WL_DBG(("Beacon is larger than buffer. Discarding\n")); @@ -7016,7 +7510,7 @@ static s32 wl_inform_single_bss(struct wl_priv *wl, struct wl_bss_info *bi, u8 i kfree(notif_bss_info); return -EINVAL; } - notif_bss_info->rssi = dtoh16(bi->RSSI) + RSSI_OFFSET; + notif_bss_info->rssi = wl_rssi_offset(dtoh16(bi->RSSI)); memcpy(mgmt->bssid, &bi->BSSID, ETHER_ADDR_LEN); mgmt_type = wl->active_scan ? IEEE80211_STYPE_PROBE_RESP : IEEE80211_STYPE_BEACON; @@ -7030,37 +7524,8 @@ static s32 wl_inform_single_bss(struct wl_priv *wl, struct wl_bss_info *bi, u8 i beacon_proberesp->beacon_int = cpu_to_le16(bi->beacon_period); beacon_proberesp->capab_info = cpu_to_le16(bi->capability); wl_rst_ie(wl); - - ie_offset = ((u8 *) bi) + bi->ie_offset; - - if (is_roam_done && ((int)(*(ie_offset)) == WLAN_EID_SSID && - ((int)(*(ie_offset+1)) == 0 || (int)(*(ie_offset+2)) == 0))) { - u8 *ie_new_offset = NULL; - uint8 ie_new_length; - - WL_ERR(("WAR trace: Changing the SSID Info, from beacon %d\n", - bi->flags & WL_BSS_FLAGS_FROM_BEACON)); - - ie_new_offset = (u8 *)kzalloc(WL_BSS_INFO_MAX, GFP_KERNEL); - if (ie_new_offset) { - *(ie_new_offset) = WLAN_EID_SSID; - *(ie_new_offset+1) = bi->SSID_len; - memcpy(ie_new_offset+2, bi->SSID, bi->SSID_len); - ie_new_length = bi->ie_length - *(ie_offset+1) + bi->SSID_len; - - /* Copy the remaining IE apart from SSID IE from bi */ - memcpy(ie_new_offset+2 + bi->SSID_len, - ie_offset+2 + *(ie_offset+1), - bi->ie_length - 2 - *(ie_offset+1)); - wl_mrg_ie(wl, ie_new_offset, ie_new_length); - kfree(ie_new_offset); - } else { - wl_mrg_ie(wl, ((u8 *) bi) + bi->ie_offset, bi->ie_length); - } - } else { - wl_mrg_ie(wl, ((u8 *) bi) + bi->ie_offset, bi->ie_length); - } - + wl_update_hidden_ap_ie(bi, ((u8 *) bi) + bi->ie_offset, &bi->ie_length); + wl_mrg_ie(wl, ((u8 *) bi) + bi->ie_offset, bi->ie_length); wl_cp_ie(wl, beacon_proberesp->variable, WL_BSS_INFO_MAX - offsetof(struct wl_cfg80211_bss_info, frame_buf)); notif_bss_info->frame_len = offsetof(struct ieee80211_mgmt, @@ -7090,7 +7555,7 @@ static s32 wl_inform_single_bss(struct wl_priv *wl, struct wl_bss_info *bi, u8 i signal = notif_bss_info->rssi * 100; if (!mgmt->u.probe_resp.timestamp) { -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 39) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 39)) struct timespec ts; get_monotonic_boottime(&ts); mgmt->u.probe_resp.timestamp = ((u64)ts.tv_sec*1000000) @@ -7112,7 +7577,11 @@ static s32 wl_inform_single_bss(struct wl_priv *wl, struct wl_bss_info *bi, u8 i return -EINVAL; } +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0)) + cfg80211_put_bss(wiphy, cbss); +#else cfg80211_put_bss(cbss); +#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0) */ kfree(notif_bss_info); return err; } @@ -7190,7 +7659,8 @@ wl_notify_connect_status_ap(struct wl_priv *wl, struct net_device *ndev, u32 reason = ntoh32(e->reason); u32 len = ntoh32(e->datalen); -#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 2, 0)) && !defined(WL_CFG80211_STA_EVENT) +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 2, 0)) && !defined(WL_CFG80211_STA_EVENT) \ + && !defined(WL_COMPAT_WIRELESS) bool isfree = false; u8 *mgmt_frame; u8 bsscfgidx = e->bsscfgidx; @@ -7206,7 +7676,7 @@ wl_notify_connect_status_ap(struct wl_priv *wl, struct net_device *ndev, channel_info_t ci; #else struct station_info sinfo; -#endif /* (LINUX_VERSION_CODE < KERNEL_VERSION(3, 2, 0)) && !WL_CFG80211_STA_EVENT */ +#endif /* (LINUX_VERSION < VERSION(3,2,0)) && !WL_CFG80211_STA_EVENT && !WL_COMPAT_WIRELESS */ WL_DBG(("event %d status %d reason %d\n", event, ntoh32(e->status), reason)); /* if link down, bsscfg is disabled. */ @@ -7218,7 +7688,8 @@ wl_notify_connect_status_ap(struct wl_priv *wl, struct net_device *ndev, return 0; } -#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 2, 0)) && !defined(WL_CFG80211_STA_EVENT) +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 2, 0)) && !defined(WL_CFG80211_STA_EVENT) \ + && !defined(WL_COMPAT_WIRELESS) WL_DBG(("Enter \n")); if (!len && (event == WLC_E_DEAUTH)) { len = 2; /* reason code field */ @@ -7263,9 +7734,9 @@ wl_notify_connect_status_ap(struct wl_priv *wl, struct net_device *ndev, bcmevent_names[event].name, event, ntoh32(e->status), reason)); break; case WLC_E_DEAUTH: + fc = FC_DISASSOC; WL_ERR(("event %s(%d) status %d reason %d\n", bcmevent_names[event].name, event, ntoh32(e->status), reason)); - fc = FC_DISASSOC; break; default: fc = 0; @@ -7301,23 +7772,23 @@ wl_notify_connect_status_ap(struct wl_priv *wl, struct net_device *ndev, isfree = true; if (event == WLC_E_ASSOC_IND && reason == DOT11_SC_SUCCESS) { -#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0)) || defined(WL_COMPAT_WIRELESS) cfg80211_rx_mgmt(ndev, freq, 0, mgmt_frame, len, GFP_ATOMIC); #else cfg80211_rx_mgmt(ndev, freq, mgmt_frame, len, GFP_ATOMIC); -#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0) */ +#endif /* LINUX_VERSION >= VERSION(3,4,0) || WL_COMPAT_WIRELESS */ } else if (event == WLC_E_DISASSOC_IND) { -#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0)) || defined(WL_COMPAT_WIRELESS) cfg80211_rx_mgmt(ndev, freq, 0, mgmt_frame, len, GFP_ATOMIC); #else cfg80211_rx_mgmt(ndev, freq, mgmt_frame, len, GFP_ATOMIC); -#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0) */ +#endif /* LINUX_VERSION >= VERSION(3,4,0) || WL_COMPAT_WIRELESS */ } else if ((event == WLC_E_DEAUTH_IND) || (event == WLC_E_DEAUTH)) { -#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0)) || defined(WL_COMPAT_WIRELESS) cfg80211_rx_mgmt(ndev, freq, 0, mgmt_frame, len, GFP_ATOMIC); #else cfg80211_rx_mgmt(ndev, freq, mgmt_frame, len, GFP_ATOMIC); -#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0) */ +#endif /* LINUX_VERSION >= VERSION(3,4,0) || WL_COMPAT_WIRELESS */ } exit: @@ -7325,8 +7796,7 @@ wl_notify_connect_status_ap(struct wl_priv *wl, struct net_device *ndev, kfree(mgmt_frame); if (body) kfree(body); - return err; -#else /* LINUX_VERSION_CODE < KERNEL_VERSION(3, 2, 0) && !WL_CFG80211_STA_EVENT */ +#else /* LINUX_VERSION < VERSION(3,2,0) && !WL_CFG80211_STA_EVENT && !WL_COMPAT_WIRELESS */ sinfo.filled = 0; if (((event == WLC_E_ASSOC_IND) || (event == WLC_E_REASSOC_IND)) && reason == DOT11_SC_SUCCESS) { @@ -7343,7 +7813,7 @@ wl_notify_connect_status_ap(struct wl_priv *wl, struct net_device *ndev, } else if ((event == WLC_E_DEAUTH_IND) || (event == WLC_E_DEAUTH)) { cfg80211_del_sta(ndev, e->addr.octet, GFP_ATOMIC); } -#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(3, 2, 0) && !WL_CFG80211_STA_EVENT */ +#endif /* LINUX_VERSION < VERSION(3,2,0) && !WL_CFG80211_STA_EVENT && !WL_COMPAT_WIRELESS */ return err; } @@ -7398,7 +7868,7 @@ wl_notify_connect_status_ibss(struct wl_priv *wl, struct net_device *ndev, MAC2STRDBG(cur_bssid), MAC2STRDBG((u8 *)&e->addr))); wl_get_assoc_ies(wl, ndev); wl_update_prof(wl, ndev, NULL, (void *)&e->addr, WL_PROF_BSSID); - wl_update_bss_info(wl, ndev, 1); + wl_update_bss_info(wl, ndev); cfg80211_ibss_joined(ndev, (s8 *)&e->addr, GFP_KERNEL); } else { @@ -7407,7 +7877,7 @@ wl_notify_connect_status_ibss(struct wl_priv *wl, struct net_device *ndev, wl_link_up(wl); wl_get_assoc_ies(wl, ndev); wl_update_prof(wl, ndev, NULL, (void *)&e->addr, WL_PROF_BSSID); - wl_update_bss_info(wl, ndev, 1); + wl_update_bss_info(wl, ndev); cfg80211_ibss_joined(ndev, (s8 *)&e->addr, GFP_KERNEL); wl_set_drv_status(wl, CONNECTED, ndev); active = true; @@ -7429,13 +7899,16 @@ wl_notify_connect_status_ibss(struct wl_priv *wl, struct net_device *ndev, } static s32 -wl_notify_connect_status(struct wl_priv *wl, struct net_device *ndev, +wl_notify_connect_status(struct wl_priv *wl, bcm_struct_cfgdev *cfgdev, const wl_event_msg_t *e, void *data) { bool act; + struct net_device *ndev = NULL; s32 err = 0; u32 event = ntoh32(e->event_type); + ndev = cfgdev_to_wlc_ndev(cfgdev, wl); + if (wl_get_mode_by_netdev(wl, ndev) == WL_MODE_AP) { err = wl_notify_connect_status_ap(wl, ndev, e, data); } else if (wl_get_mode_by_netdev(wl, ndev) == WL_MODE_IBSS) { @@ -7451,12 +7924,12 @@ wl_notify_connect_status(struct wl_priv *wl, struct net_device *ndev, wl_link_up(wl); act = true; if (!wl_get_drv_status(wl, DISCONNECTING, ndev)) { - printk("wl_bss_connect_done succeeded with " MACDBG "\n", - MAC2STRDBG((u8*)(&e->addr))); - wl_bss_connect_done(wl, ndev, e, data, true); - WL_DBG(("joined in BSS network \"%s\"\n", - ((struct wlc_ssid *) - wl_read_prof(wl, ndev, WL_PROF_SSID))->SSID)); + printk("wl_bss_connect_done succeeded with " MACDBG "\n", + MAC2STRDBG((u8*)(&e->addr))); + wl_bss_connect_done(wl, ndev, e, data, true); + WL_DBG(("joined in BSS network \"%s\"\n", + ((struct wlc_ssid *) + wl_read_prof(wl, ndev, WL_PROF_SSID))->SSID)); } wl_update_prof(wl, ndev, e, &act, WL_PROF_ACT); wl_update_prof(wl, ndev, NULL, (void *)&e->addr, WL_PROF_BSSID); @@ -7478,6 +7951,7 @@ wl_notify_connect_status(struct wl_priv *wl, struct net_device *ndev, reason = ntoh32(e->reason); /* WLAN_REASON_UNSPECIFIED is used for hang up event in Android */ reason = (reason == WLAN_REASON_UNSPECIFIED)? 0 : reason; + printk("link down if %s may call cfg80211_disconnected. " "event : %d, reason=%d from " MACDBG "\n", ndev->name, event, ntoh32(e->reason), @@ -7509,6 +7983,7 @@ wl_notify_connect_status(struct wl_priv *wl, struct net_device *ndev, } } else if (wl_get_drv_status(wl, CONNECTING, ndev)) { + printk("link down, during connecting\n"); #ifdef ESCAN_RESULT_PATCH if ((memcmp(connect_req_bssid, broad_bssid, ETHER_ADDR_LEN) == 0) || @@ -7547,15 +8022,48 @@ wl_notify_connect_status(struct wl_priv *wl, struct net_device *ndev, return err; } +#ifdef WLAIBSS +void wl_cfg80211_set_txfail_pid(int pid) +{ + struct wl_priv *wl = wlcfg_drv_priv; + if (pid > 0) + wl->aibss_txfail_pid = pid; + WL_DBG(("txfail : pid=%d\n", pid)); +} + +static s32 +wl_notify_aibss_txfail(struct wl_priv *wl, struct net_device *ndev, + const wl_event_msg_t *e, void *data) +{ + u32 evt = ntoh32(e->event_type); + int ret = -1; + + if (wl->aibss_txfail_pid != 0) { + ret = wl_netlink_send_msg(wl->aibss_txfail_pid, wl->aibss_txfail_seq++, + (void *)&e->addr, ETHER_ADDR_LEN); + } + + WL_DBG(("txfail : evt=%d, pid=%d, ret=%d, mac=" MACF "\n", + evt, wl->aibss_txfail_pid, ret, ETHERP_TO_MACF(&e->addr))); + + return ret; +} +#endif /* WLAIBSS */ + static s32 -wl_notify_roaming_status(struct wl_priv *wl, struct net_device *ndev, +wl_notify_roaming_status(struct wl_priv *wl, bcm_struct_cfgdev *cfgdev, const wl_event_msg_t *e, void *data) { bool act; + struct net_device *ndev = NULL; s32 err = 0; u32 event = be32_to_cpu(e->event_type); u32 status = be32_to_cpu(e->status); + WL_DBG(("Enter \n")); + + ndev = cfgdev_to_wlc_ndev(cfgdev, wl); + if (event == WLC_E_ROAM && status == WLC_E_STATUS_SUCCESS) { if (wl_get_drv_status(wl, CONNECTED, ndev)) wl_bss_roaming_done(wl, ndev, e, data); @@ -7683,7 +8191,7 @@ static void wl_ch_to_chanspec(int ch, struct wl_join_params *join_params, } } -static s32 wl_update_bss_info(struct wl_priv *wl, struct net_device *ndev, u8 is_roam_done) +static s32 wl_update_bss_info(struct wl_priv *wl, struct net_device *ndev) { struct cfg80211_bss *bss; struct wl_bss_info *bi; @@ -7693,7 +8201,6 @@ static s32 wl_update_bss_info(struct wl_priv *wl, struct net_device *ndev, u8 is s32 dtim_period; size_t ie_len; u8 *ie; - u8 *ssidie; u8 *curbssid; s32 err = 0; struct wiphy *wiphy; @@ -7718,17 +8225,11 @@ static s32 wl_update_bss_info(struct wl_priv *wl, struct net_device *ndev, u8 is } bi = (struct wl_bss_info *)(wl->extra_buf + 4); if (memcmp(bi->BSSID.octet, curbssid, ETHER_ADDR_LEN)) { + WL_ERR(("Bssid doesn't match\n")); err = -EIO; goto update_bss_info_out; } - - ie = ((u8 *)bi) + bi->ie_offset; - ie_len = bi->ie_length; - ssidie = (u8 *)cfg80211_find_ie(WLAN_EID_SSID, ie, ie_len); - if (ssidie && ssidie[1] == bi->SSID_len && !ssidie[2] && bi->SSID[0]) - memcpy(ssidie + 2, bi->SSID, bi->SSID_len); - - err = wl_inform_single_bss(wl, bi, is_roam_done); + err = wl_inform_single_bss(wl, bi); if (unlikely(err)) goto update_bss_info_out; @@ -7737,10 +8238,19 @@ static s32 wl_update_bss_info(struct wl_priv *wl, struct net_device *ndev, u8 is beacon_interval = cpu_to_le16(bi->beacon_period); } else { WL_DBG(("Found the AP in the list - BSSID %pM\n", bss->bssid)); +#if defined(WL_CFG80211_P2P_DEV_IF) + ie = (u8 *)bss->ies->data; + ie_len = bss->ies->len; +#else ie = bss->information_elements; ie_len = bss->len_information_elements; +#endif /* WL_CFG80211_P2P_DEV_IF */ beacon_interval = bss->beacon_interval; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0)) + cfg80211_put_bss(wiphy, bss); +#else cfg80211_put_bss(bss); +#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0) */ } tim = bcm_parse_tlvs(ie, ie_len, WLAN_EID_TIM); @@ -7764,6 +8274,9 @@ static s32 wl_update_bss_info(struct wl_priv *wl, struct net_device *ndev, u8 is wl_update_prof(wl, ndev, NULL, &dtim_period, WL_PROF_DTIMPERIOD); update_bss_info_out: + if (unlikely(err)) { + WL_ERR(("Failed with error %d\n", err)); + } mutex_unlock(&wl->usr_sync); return err; } @@ -7775,7 +8288,7 @@ wl_bss_roaming_done(struct wl_priv *wl, struct net_device *ndev, struct wl_connect_info *conn_info = wl_to_conn(wl); s32 err = 0; u8 *curbssid; -#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 39) +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 39)) || defined(WL_COMPAT_WIRELESS) struct wl_bss_info *bss_info; struct wiphy *wiphy = wl_to_wiphy(wl); struct ieee80211_supported_band *band; @@ -7783,15 +8296,15 @@ wl_bss_roaming_done(struct wl_priv *wl, struct net_device *ndev, u8 *buf; u16 channel; u32 freq; -#endif /* LINUX_VERSION > 2.6.39 */ +#endif /* LINUX_VERSION > 2.6.39 || WL_COMPAT_WIRELESS */ wl_get_assoc_ies(wl, ndev); wl_update_prof(wl, ndev, NULL, (void *)(e->addr.octet), WL_PROF_BSSID); curbssid = wl_read_prof(wl, ndev, WL_PROF_BSSID); - wl_update_bss_info(wl, ndev, 1); + wl_update_bss_info(wl, ndev); wl_update_pmklist(ndev, wl->pmk_list, err); -#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 39) +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 39)) || defined(WL_COMPAT_WIRELESS) /* channel info for cfg80211_roamed introduced in 2.6.39-rc1 */ buf = kzalloc(WL_EXTRA_BUF_MAX, GFP_KERNEL); if (!buf) @@ -7813,13 +8326,21 @@ wl_bss_roaming_done(struct wl_priv *wl, struct net_device *ndev, notify_channel = ieee80211_get_channel(wiphy, freq); done: kfree(buf); -#endif /* LINUX_VERSION > 2.6.39 */ - +#endif /* LINUX_VERSION > 2.6.39 || WL_COMPAT_WIRELESS */ +#ifdef WLFBT + /* back up the given FBT key for the further supplicant request, + * currently not checking the FBT is enabled for current BSS in DHD, + * because the supplicant decides to take it or not. + */ + if (data) { + memcpy(wl->fbt_key, data, FBT_KEYLEN); + } +#endif /* WLFBT */ printk("wl_bss_roaming_done succeeded to " MACDBG "\n", MAC2STRDBG((u8*)(&e->addr))); cfg80211_roamed(ndev, -#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 39) +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 39)) || defined(WL_COMPAT_WIRELESS) notify_channel, #endif curbssid, @@ -7879,7 +8400,7 @@ wl_bss_connect_done(struct wl_priv *wl, struct net_device *ndev, wl_get_assoc_ies(wl, ndev); wl_update_prof(wl, ndev, NULL, (void *)(e->addr.octet), WL_PROF_BSSID); curbssid = wl_read_prof(wl, ndev, WL_PROF_BSSID); - wl_update_bss_info(wl, ndev, 0); + wl_update_bss_info(wl, ndev); wl_update_pmklist(ndev, wl->pmk_list, err); wl_set_drv_status(wl, CONNECTED, ndev); #if defined(ROAM_ENABLE) && defined(ROAM_AP_ENV_DETECTION) @@ -7912,12 +8433,15 @@ wl_bss_connect_done(struct wl_priv *wl, struct net_device *ndev, } static s32 -wl_notify_mic_status(struct wl_priv *wl, struct net_device *ndev, +wl_notify_mic_status(struct wl_priv *wl, bcm_struct_cfgdev *cfgdev, const wl_event_msg_t *e, void *data) { + struct net_device *ndev = NULL; u16 flags = ntoh16(e->flags); enum nl80211_key_type key_type; + ndev = cfgdev_to_wlc_ndev(cfgdev, wl); + mutex_lock(&wl->usr_sync); if (flags & WLC_EVENT_MSG_GROUP) key_type = NL80211_KEYTYPE_GROUP; @@ -7933,11 +8457,15 @@ wl_notify_mic_status(struct wl_priv *wl, struct net_device *ndev, #ifdef PNO_SUPPORT static s32 -wl_notify_pfn_status(struct wl_priv *wl, struct net_device *ndev, +wl_notify_pfn_status(struct wl_priv *wl, bcm_struct_cfgdev *cfgdev, const wl_event_msg_t *e, void *data) { + struct net_device *ndev = NULL; + WL_ERR((">>> PNO Event\n")); + ndev = cfgdev_to_wlc_ndev(cfgdev, wl); + #ifndef WL_SCHED_SCAN #ifndef CUSTOMER_HW4 mutex_lock(&wl->usr_sync); @@ -7956,11 +8484,12 @@ wl_notify_pfn_status(struct wl_priv *wl, struct net_device *ndev, #endif /* PNO_SUPPORT */ static s32 -wl_notify_scan_status(struct wl_priv *wl, struct net_device *ndev, +wl_notify_scan_status(struct wl_priv *wl, bcm_struct_cfgdev *cfgdev, const wl_event_msg_t *e, void *data) { struct channel_info channel_inform; struct wl_scan_results *bss_list; + struct net_device *ndev = NULL; u32 len = WL_SCAN_BUF_MAX; s32 err = 0; unsigned long flags; @@ -7973,6 +8502,8 @@ wl_notify_scan_status(struct wl_priv *wl, struct net_device *ndev, if (wl->iscan_on && wl->iscan_kickstart) return wl_wakeup_iscan(wl_to_iscan(wl)); + ndev = cfgdev_to_wlc_ndev(cfgdev, wl); + mutex_lock(&wl->usr_sync); wl_clr_drv_status(wl, SCANNING, ndev); err = wldev_ioctl(ndev, WLC_GET_CHANNEL, &channel_inform, @@ -7992,7 +8523,7 @@ wl_notify_scan_status(struct wl_priv *wl, struct net_device *ndev, memset(bss_list, 0, len); bss_list->buflen = htod32(len); err = wldev_ioctl(ndev, WLC_SCAN_RESULTS, bss_list, len, false); - if (unlikely(err)) { + if (unlikely(err) && unlikely(!wl->scan_suppressed)) { WL_ERR(("%s Scan_results error (%d)\n", ndev->name, err)); err = -EINVAL; goto scan_done_out; @@ -8015,6 +8546,7 @@ wl_notify_scan_status(struct wl_priv *wl, struct net_device *ndev, mutex_unlock(&wl->usr_sync); return err; } + static s32 wl_frame_get_mgmt(u16 fc, const struct ether_addr *da, const struct ether_addr *sa, const struct ether_addr *bssid, @@ -8110,7 +8642,7 @@ wl_gon_req_collision(struct wl_priv *wl, wl_action_frame_t *tx_act_frm, #endif /* WL_CFG80211_GON_COLLISION */ void -wl_stop_wait_next_action_frame(struct wl_priv *wl, struct net_device *ndev) +wl_stop_wait_next_action_frame(struct wl_priv *wl) { if (wl_get_drv_status_all(wl, SENDING_ACT_FRM)) { if (!(wl_get_p2p_status(wl, ACTION_TX_COMPLETED) || @@ -8171,16 +8703,15 @@ bool wl_cfg80211_is_wes(void *frame, u32 frame_len) } #endif /* WES_SUPPORT */ -#ifdef WL_CFG80211 int wl_cfg80211_get_ioctl_version(void) { return ioctl_version; } -#endif /* WL_CFG80211 */ static s32 -wl_notify_rx_mgmt_frame(struct wl_priv *wl, struct net_device *ndev, +wl_notify_rx_mgmt_frame(struct wl_priv *wl, bcm_struct_cfgdev *cfgdev, const wl_event_msg_t *e, void *data) + { struct ieee80211_supported_band *band; struct wiphy *wiphy = wl_to_wiphy(wl); @@ -8189,7 +8720,7 @@ wl_notify_rx_mgmt_frame(struct wl_priv *wl, struct net_device *ndev, bool isfree = false; s32 err = 0; s32 freq; - struct net_device *dev = NULL; + struct net_device *ndev = NULL; wifi_p2p_pub_act_frame_t *act_frm = NULL; wifi_p2p_action_frame_t *p2p_act_frm = NULL; wifi_p2psd_gas_pub_act_frame_t *sd_act_frm = NULL; @@ -8203,11 +8734,7 @@ wl_notify_rx_mgmt_frame(struct wl_priv *wl, struct net_device *ndev, memset(&bssid, 0, ETHER_ADDR_LEN); - if (wl->p2p_net == ndev) { - dev = wl_to_prmry_ndev(wl); - } else { - dev = ndev; - } + ndev = cfgdev_to_wlc_ndev(cfgdev, wl); if (channel <= CH_MAX_2G_CHANNEL) band = wiphy->bands[IEEE80211_BAND_2GHZ]; @@ -8224,10 +8751,10 @@ wl_notify_rx_mgmt_frame(struct wl_priv *wl, struct net_device *ndev, freq = ieee80211_channel_to_frequency(channel, band->band); #endif if (event == WLC_E_ACTION_FRAME_RX) { - wldev_iovar_getbuf_bsscfg(dev, "cur_etheraddr", + wldev_iovar_getbuf_bsscfg(ndev, "cur_etheraddr", NULL, 0, wl->ioctl_buf, WLC_IOCTL_SMLEN, bsscfgidx, &wl->ioctl_buf_sync); - err = wldev_ioctl(dev, WLC_GET_BSSID, &bssid, ETHER_ADDR_LEN, false); + err = wldev_ioctl(ndev, WLC_GET_BSSID, &bssid, ETHER_ADDR_LEN, false); if (err < 0) WL_ERR(("WLC_GET_BSSID error %d\n", err)); memcpy(da.octet, wl->ioctl_buf, ETHER_ADDR_LEN); @@ -8258,12 +8785,10 @@ wl_notify_rx_mgmt_frame(struct wl_priv *wl, struct net_device *ndev, if (wl->next_af_subtype == sd_act_frm->action) { WL_DBG(("We got a right next frame of SD!(%d)\n", sd_act_frm->action)); - wl_clr_drv_status(wl, WAITING_NEXT_ACT_FRM, - (ndev == wl->p2p_net) ? - wl_to_prmry_ndev(wl) : ndev); + wl_clr_drv_status(wl, WAITING_NEXT_ACT_FRM, ndev); /* Stop waiting for next AF. */ - wl_stop_wait_next_action_frame(wl, ndev); + wl_stop_wait_next_action_frame(wl); } } (void) sd_act_frm; @@ -8279,8 +8804,10 @@ wl_notify_rx_mgmt_frame(struct wl_priv *wl, struct net_device *ndev, goto exit; } #endif /* WES_SUPPORT */ - if (wl->p2p_net == ndev) - ndev = wl_to_prmry_ndev(wl); +#if defined(WL_ENABLE_P2P_IF) + if (wl->p2p_net == cfgdev) + cfgdev = wl_to_prmry_ndev(wl); +#endif /* WL_ENABLE_P2P_IF */ if (wl->next_af_subtype != P2P_PAF_SUBTYPE_INVALID) { u8 action = 0; @@ -8293,7 +8820,7 @@ wl_notify_rx_mgmt_frame(struct wl_priv *wl, struct net_device *ndev, wl_clr_drv_status(wl, WAITING_NEXT_ACT_FRM, ndev); /* Stop waiting for next AF. */ - wl_stop_wait_next_action_frame(wl, ndev); + wl_stop_wait_next_action_frame(wl); } } } @@ -8322,12 +8849,14 @@ wl_notify_rx_mgmt_frame(struct wl_priv *wl, struct net_device *ndev, if (wl->next_af_subtype == act_frm->subtype) { WL_DBG(("We got a right next frame!(%d)\n", act_frm->subtype)); - wl_clr_drv_status(wl, WAITING_NEXT_ACT_FRM, - (ndev == wl->p2p_net) ? - wl_to_prmry_ndev(wl) : ndev); + wl_clr_drv_status(wl, WAITING_NEXT_ACT_FRM, ndev); + + if (wl->next_af_subtype == P2P_PAF_GON_CONF) { + OSL_SLEEP(20); + } /* Stop waiting for next AF. */ - wl_stop_wait_next_action_frame(wl, ndev); + wl_stop_wait_next_action_frame(wl); } } } @@ -8339,7 +8868,7 @@ wl_notify_rx_mgmt_frame(struct wl_priv *wl, struct net_device *ndev, */ if (act_frm && ((act_frm->subtype == P2P_PAF_GON_CONF) || (act_frm->subtype == P2P_PAF_PROVDIS_RSP))) { - wldev_iovar_setint(dev, "mpc", 1); + wldev_iovar_setint(ndev, "mpc", 1); } if (act_frm && (act_frm->subtype == P2P_PAF_GON_CONF)) { WL_DBG(("P2P: GO_NEG_PHASE status cleared \n")); @@ -8384,11 +8913,11 @@ wl_notify_rx_mgmt_frame(struct wl_priv *wl, struct net_device *ndev, } } -#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0) - cfg80211_rx_mgmt(ndev, freq, 0, mgmt_frame, mgmt_frame_len, GFP_ATOMIC); +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0)) || defined(WL_COMPAT_WIRELESS) + cfg80211_rx_mgmt(cfgdev, freq, 0, mgmt_frame, mgmt_frame_len, GFP_ATOMIC); #else - cfg80211_rx_mgmt(ndev, freq, mgmt_frame, mgmt_frame_len, GFP_ATOMIC); -#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0) */ + cfg80211_rx_mgmt(cfgdev, freq, mgmt_frame, mgmt_frame_len, GFP_ATOMIC); +#endif /* LINUX_VERSION >= VERSION(3, 4, 0) || WL_COMPAT_WIRELESS */ WL_DBG(("mgmt_frame_len (%d) , e->datalen (%d), channel (%d), freq (%d)\n", mgmt_frame_len, ntoh32(e->datalen), channel, freq)); @@ -8408,14 +8937,15 @@ wl_notify_sched_scan_results(struct wl_priv *wl, struct net_device *ndev, const wl_event_msg_t *e, void *data) { wl_pfn_net_info_t *netinfo, *pnetinfo; - struct cfg80211_scan_request request; struct wiphy *wiphy = wl_to_wiphy(wl); int err = 0; + struct cfg80211_scan_request *request = NULL; struct cfg80211_ssid ssid[MAX_PFN_LIST_COUNT]; struct ieee80211_channel *channel = NULL; int channel_req = 0; int band = 0; struct wl_pfn_scanresults *pfn_result = (struct wl_pfn_scanresults *)data; + int n_pfn_results = pfn_result->count; WL_DBG(("Enter\n")); @@ -8423,26 +8953,32 @@ wl_notify_sched_scan_results(struct wl_priv *wl, struct net_device *ndev, WL_PNO(("PFN NET LOST event. Do Nothing \n")); return 0; } - WL_PNO((">>> PFN NET FOUND event. count:%d \n", pfn_result->count)); - if (pfn_result->count > 0) { + WL_PNO((">>> PFN NET FOUND event. count:%d \n", n_pfn_results)); + if (n_pfn_results > 0) { int i; - memset(&request, 0x00, sizeof(struct cfg80211_scan_request)); - memset(&ssid, 0x00, sizeof(ssid)); - request.wiphy = wiphy; - + if (n_pfn_results > MAX_PFN_LIST_COUNT) + n_pfn_results = MAX_PFN_LIST_COUNT; pnetinfo = (wl_pfn_net_info_t *)(data + sizeof(wl_pfn_scanresults_t) - sizeof(wl_pfn_net_info_t)); + + memset(&ssid, 0x00, sizeof(ssid)); + + request = kzalloc(sizeof(*request) + + sizeof(*request->channels) * n_pfn_results, + GFP_KERNEL); channel = (struct ieee80211_channel *)kzalloc( - (sizeof(struct ieee80211_channel) * MAX_PFN_LIST_COUNT), + (sizeof(struct ieee80211_channel) * n_pfn_results), GFP_KERNEL); - if (!channel) { + if (!request || !channel) { WL_ERR(("No memory")); err = -ENOMEM; goto out_err; } - for (i = 0; i < pfn_result->count; i++) { + request->wiphy = wiphy; + + for (i = 0; i < n_pfn_results; i++) { netinfo = &pnetinfo[i]; if (!netinfo) { WL_ERR(("Invalid netinfo ptr. index:%d", i)); @@ -8460,7 +8996,7 @@ wl_notify_sched_scan_results(struct wl_priv *wl, struct net_device *ndev, memcpy(ssid[i].ssid, netinfo->pfnsubnet.SSID, netinfo->pfnsubnet.SSID_len); ssid[i].ssid_len = netinfo->pfnsubnet.SSID_len; - request.n_ssids++; + request->n_ssids++; channel_req = netinfo->pfnsubnet.channel; band = (channel_req <= CH_MAX_2G_CHANNEL) ? NL80211_BAND_2GHZ @@ -8468,13 +9004,13 @@ wl_notify_sched_scan_results(struct wl_priv *wl, struct net_device *ndev, channel[i].center_freq = ieee80211_channel_to_frequency(channel_req, band); channel[i].band = band; channel[i].flags |= IEEE80211_CHAN_NO_HT40; - request.channels[i] = &channel[i]; - request.n_channels++; + request->channels[i] = &channel[i]; + request->n_channels++; } /* assign parsed ssid array */ - if (request.n_ssids) - request.ssids = &ssid[0]; + if (request->n_ssids) + request->ssids = &ssid[0]; if (wl_get_drv_status_all(wl, SCANNING)) { /* Abort any on-going scan */ @@ -8488,6 +9024,7 @@ wl_notify_sched_scan_results(struct wl_priv *wl, struct net_device *ndev, wl_clr_drv_status(wl, SCANNING, ndev); goto out_err; } + p2p_scan(wl) = false; } wl_set_drv_status(wl, SCANNING, ndev); @@ -8496,7 +9033,7 @@ wl_notify_sched_scan_results(struct wl_priv *wl, struct net_device *ndev, err = wl_do_escan(wl, wiphy, ndev, NULL); #else WL_PNO((">>> Doing targeted ESCAN on PNO event\n")); - err = wl_do_escan(wl, wiphy, ndev, &request); + err = wl_do_escan(wl, wiphy, ndev, request); #endif if (err) { wl_clr_drv_status(wl, SCANNING, ndev); @@ -8508,6 +9045,8 @@ wl_notify_sched_scan_results(struct wl_priv *wl, struct net_device *ndev, WL_ERR(("FALSE PNO Event. (pfn_count == 0) \n")); } out_err: + if (request) + kfree(request); if (channel) kfree(channel); return err; @@ -8561,8 +9100,44 @@ static void wl_init_event_handler(struct wl_priv *wl) #ifdef PNO_SUPPORT wl->evt_handler[WLC_E_PFN_NET_FOUND] = wl_notify_pfn_status; #endif /* PNO_SUPPORT */ +#ifdef WLTDLS wl->evt_handler[WLC_E_TDLS_PEER_EVENT] = wl_tdls_event_handler; +#endif /* WLTDLS */ +#ifdef WLAIBSS + wl->evt_handler[WLC_E_AIBSS_TXFAIL] = wl_notify_aibss_txfail; +#endif /* WLAIBSS */ +#ifdef BCMCCX_S69 + wl->evt_handler[WLC_E_CCX_S69_RESP_RX] = wl_ccx_s69_response; +#endif +} + +#if defined(STATIC_WL_PRIV_STRUCT) +static void +wl_init_escan_result_buf(struct wl_priv *wl) +{ +#if defined(DUAL_ESCAN_RESULT_BUFFER) + wl->escan_info.escan_buf[0] = dhd_os_prealloc(NULL, DHD_PREALLOC_WIPHY_ESCAN0, 0); + bzero(wl->escan_info.escan_buf[0], ESCAN_BUF_SIZE); + wl->escan_info.escan_buf[1] = dhd_os_prealloc(NULL, DHD_PREALLOC_WIPHY_ESCAN1, 0); + bzero(wl->escan_info.escan_buf[1], ESCAN_BUF_SIZE); +#else + wl->escan_info.escan_buf = dhd_os_prealloc(NULL, DHD_PREALLOC_WIPHY_ESCAN0, 0); + bzero(wl->escan_info.escan_buf, ESCAN_BUF_SIZE); +#endif /* DUAL_ESCAN_RESULT_BUFFER */ +} + +static void +wl_deinit_escan_result_buf(struct wl_priv *wl) +{ +#if defined(DUAL_ESCAN_RESULT_BUFFER) + wl->escan_info.escan_buf[0] = NULL; + wl->escan_info.escan_buf[1] = NULL; +#else + wl->escan_info.escan_buf = NULL; +#endif + } +#endif /* STATIC_WL_PRIV_STRUCT */ static s32 wl_init_priv_mem(struct wl_priv *wl) { @@ -8625,15 +9200,7 @@ static s32 wl_init_priv_mem(struct wl_priv *wl) WL_ERR(("wl->ie alloc failed\n")); goto init_priv_mem_out; } -#if defined(CUSTOMER_HW4) && defined(DUAL_ESCAN_RESULT_BUFFER) - wl->escan_info.escan_buf[0] = dhd_os_prealloc(NULL, DHD_PREALLOC_WIPHY_ESCAN0, 0); - bzero(wl->escan_info.escan_buf[0], ESCAN_BUF_SIZE); - wl->escan_info.escan_buf[1] = dhd_os_prealloc(NULL, DHD_PREALLOC_WIPHY_ESCAN1, 0); - bzero(wl->escan_info.escan_buf[1], ESCAN_BUF_SIZE); -#else - wl->escan_info.escan_buf = dhd_os_prealloc(NULL, DHD_PREALLOC_WIPHY_ESCAN0, 0); - bzero(wl->escan_info.escan_buf, ESCAN_BUF_SIZE); -#endif /* CUSTOMER_HW4 && DUAL_ESCAN_RESULT_BUFFER */ + wl_init_escan_result_buf(wl); #endif /* STATIC_WL_PRIV_STRUCT */ wl->afx_hdl = (void *)kzalloc(sizeof(*wl->afx_hdl), GFP_KERNEL); if (unlikely(!wl->afx_hdl)) { @@ -8678,12 +9245,7 @@ static void wl_deinit_priv_mem(struct wl_priv *wl) wl->conn_info = NULL; kfree(wl->ie); wl->ie = NULL; -#if defined(CUSTOMER_HW4) && defined(DUAL_ESCAN_RESULT_BUFFER) - wl->escan_info.escan_buf[0] = NULL; - wl->escan_info.escan_buf[1] = NULL; -#else - wl->escan_info.escan_buf = NULL; -#endif /* CUSTOMER_HW4 && DUAL_ESCAN_RESULT_BUFFER */ + wl_deinit_escan_result_buf(wl); #endif /* STATIC_WL_PRIV_STRUCT */ if (wl->afx_hdl) { cancel_work_sync(&wl->afx_hdl->work); @@ -8914,6 +9476,10 @@ static void wl_scan_timeout(unsigned long data) WL_ERR(("SCAN Timeout(ISCAN)\n")); wl_notify_iscan_complete(wl_to_iscan(wl), true); } +#if defined(CUSTOMER_HW4) && defined(DHD_DEBUG) + if (!wl_scan_timeout_dbg_enabled) + wl_scan_timeout_dbg_set(); +#endif /* CUSTOMER_HW4 && DHD_DEBUG */ } static void wl_iscan_timer(unsigned long data) @@ -9049,7 +9615,6 @@ static void wl_cfg80211_scan_abort(struct wl_priv *wl) } } } - static s32 wl_notify_escan_complete(struct wl_priv *wl, struct net_device *ndev, bool aborted, bool fw_abort) @@ -9059,7 +9624,6 @@ static s32 wl_notify_escan_complete(struct wl_priv *wl, struct net_device *dev; WL_DBG(("Enter \n")); - if (!ndev) { WL_ERR(("ndev is null\n")); err = BCME_ERROR; @@ -9073,18 +9637,18 @@ static s32 wl_notify_escan_complete(struct wl_priv *wl, } if (wl->scan_request) { - if (wl->scan_request->dev == wl->p2p_net) - dev = wl_to_prmry_ndev(wl); - else + dev = wl_to_prmry_ndev(wl); +#if defined(WL_ENABLE_P2P_IF) + if (wl->scan_request->dev != wl->p2p_net) dev = wl->scan_request->dev; +#endif /* WL_ENABLE_P2P_IF */ } else { WL_DBG(("wl->scan_request is NULL may be internal scan." - "doing scan_abort for ndev %p primary %p p2p_net %p", - ndev, wl_to_prmry_ndev(wl), wl->p2p_net)); + "doing scan_abort for ndev %p primary %p", + ndev, wl_to_prmry_ndev(wl))); dev = ndev; } - if (fw_abort && !in_atomic()) { wl_cfg80211_scan_abort(wl); } @@ -9093,17 +9657,7 @@ static s32 wl_notify_escan_complete(struct wl_priv *wl, del_timer_sync(&wl->scan_timeout); #if defined(ESCAN_RESULT_PATCH) if (likely(wl->scan_request)) { -#if defined(CUSTOMER_HW4) && defined(DUAL_ESCAN_RESULT_BUFFER) - u8 temp_id = wl->escan_info.cur_sync_id; - if (aborted) - wl->bss_list = - (wl_scan_results_t *)wl->escan_info.escan_buf[(temp_id+1)%2]; - else - wl->bss_list = - (wl_scan_results_t *)wl->escan_info.escan_buf[(temp_id)%2]; -#else - wl->bss_list = (wl_scan_results_t *)wl->escan_info.escan_buf; -#endif /* CUSTOMER_HW4 && DUAL_ESCAN_RESULT_BUFFER */ + wl->bss_list = wl_escan_get_buf(wl, aborted); wl_inform_bss(wl); } #endif /* ESCAN_RESULT_PATCH */ @@ -9111,9 +9665,7 @@ static s32 wl_notify_escan_complete(struct wl_priv *wl, #ifdef WL_SCHED_SCAN if (wl->sched_scan_req && !wl->scan_request) { WL_PNO((">>> REPORTING SCHED SCAN RESULTS \n")); - if (aborted) - cfg80211_sched_scan_stopped(wl->sched_scan_req->wiphy); - else + if (!aborted) cfg80211_sched_scan_results(wl->sched_scan_req->wiphy); wl->sched_scan_running = FALSE; wl->sched_scan_req = NULL; @@ -9127,12 +9679,10 @@ static s32 wl_notify_escan_complete(struct wl_priv *wl, wl_clr_p2p_status(wl, SCANNING); wl_clr_drv_status(wl, SCANNING, dev); spin_unlock_irqrestore(&wl->cfgdrv_lock, flags); - return err; } -static s32 wl_escan_handler(struct wl_priv *wl, - struct net_device *ndev, +static s32 wl_escan_handler(struct wl_priv *wl, bcm_struct_cfgdev *cfgdev, const wl_event_msg_t *e, void *data) { s32 err = BCME_OK; @@ -9142,6 +9692,7 @@ static s32 wl_escan_handler(struct wl_priv *wl, wl_bss_info_t *bss = NULL; wl_scan_results_t *list; wifi_p2p_ie_t * p2p_ie; + struct net_device *ndev = NULL; u32 bi_length; u32 i; u8 *p2p_dev_addr = NULL; @@ -9149,6 +9700,8 @@ static s32 wl_escan_handler(struct wl_priv *wl, WL_DBG((" enter event type : %d, status : %d \n", ntoh32(e->event_type), ntoh32(e->status))); + ndev = cfgdev_to_wlc_ndev(cfgdev, wl); + mutex_lock(&wl->usr_sync); /* P2P SCAN is coming from primary interface */ if (wl_get_p2p_status(wl, SCANNING)) { @@ -9161,24 +9714,16 @@ static s32 wl_escan_handler(struct wl_priv *wl, if (!ndev || !wl->escan_on || (!wl_get_drv_status(wl, SCANNING, ndev) && !wl->sched_scan_running)) { -#if defined(CUSTOMER_HW4) && defined(DUAL_ESCAN_RESULT_BUFFER) WL_ERR(("escan is not ready ndev %p wl->escan_on %d" " drv_status 0x%x e_type %d e_states %d\n", ndev, wl->escan_on, wl_get_drv_status(wl, SCANNING, ndev), ntoh32(e->event_type), ntoh32(e->status))); -#else - WL_ERR(("escan is not ready ndev %p wl->escan_on %d drv_status 0x%x\n", - ndev, wl->escan_on, wl_get_drv_status(wl, SCANNING, ndev))); -#endif /* CUSTOMER_HW4 && DUAL_ESCAN_RESULT_BUFFER */ goto exit; } -#if defined(CUSTOMER_HW4) && defined(DUAL_ESCAN_RESULT_BUFFER) escan_result = (wl_escan_result_t *)data; -#endif if (status == WLC_E_STATUS_PARTIAL) { WL_INFO(("WLC_E_STATUS_PARTIAL \n")); - escan_result = (wl_escan_result_t *) data; if (!escan_result) { WL_ERR(("Invalid escan result (NULL pointer)\n")); goto exit; @@ -9197,14 +9742,9 @@ static s32 wl_escan_handler(struct wl_priv *wl, WL_ERR(("Invalid bss_info length %d: ignoring\n", bi_length)); goto exit; } -#if defined(CUSTOMER_HW4) && defined(DUAL_ESCAN_RESULT_BUFFER) - if (escan_result->sync_id != wl->escan_info.cur_sync_id) { - WL_ERR(("Escan sync id mismatch: status %d " - "cur_sync_id %d coming_sync_id %d\n", - status, wl->escan_info.cur_sync_id, escan_result->sync_id)); + if (wl_escan_check_sync_id(status, escan_result->sync_id, + wl->escan_info.cur_sync_id) < 0) goto exit; - } -#endif /* CUSTOMER_HW4 && DUAL_ESCAN_RESULT_BUFFER */ if (!(wl_to_wiphy(wl)->interface_modes & BIT(NL80211_IFTYPE_ADHOC))) { if (dtoh16(bi->capability) & DOT11_CAP_IBSS) { @@ -9218,15 +9758,15 @@ static s32 wl_escan_handler(struct wl_priv *wl, if (p2p_dev_addr && !memcmp(p2p_dev_addr, wl->afx_hdl->tx_dst_addr.octet, ETHER_ADDR_LEN)) { s32 channel = wf_chspec_ctlchan( - wl_chspec_driver_to_host(bi->chanspec)); + wl_chspec_driver_to_host(bi->chanspec)); if ((channel > MAXCHANNEL) || (channel <= 0)) channel = WL_INVALID; else WL_ERR(("ACTION FRAME SCAN : Peer " MACDBG " found," - " channel : %d\n", - MAC2STRDBG(wl->afx_hdl->tx_dst_addr.octet), - channel)); + " channel : %d\n", + MAC2STRDBG(wl->afx_hdl->tx_dst_addr.octet), + channel)); wl_clr_p2p_status(wl, SCANNING); wl->afx_hdl->peer_chan = channel; @@ -9236,18 +9776,8 @@ static s32 wl_escan_handler(struct wl_priv *wl, } else { int cur_len = WL_SCAN_RESULTS_FIXED_SIZE; -#if defined(CUSTOMER_HW4) && defined(DUAL_ESCAN_RESULT_BUFFER) - list = (wl_scan_results_t *) - wl->escan_info.escan_buf[wl->escan_info.cur_sync_id % 2]; -#else - list = (wl_scan_results_t *)wl->escan_info.escan_buf; -#endif /* CUSTOMER_HW4 && DUAL_ESCAN_RESULT_BUFFER */ -#if defined(WLP2P) && defined(WL_ENABLE_P2P_IF) - if (wl->p2p_net && wl->scan_request && - wl->scan_request->dev == wl->p2p_net) { -#else - if (p2p_is_on(wl) && p2p_scan(wl)) { -#endif + list = wl_escan_get_buf(wl, FALSE); + if (scan_req_match(wl)) { #ifdef WL_HOST_BAND_MGMT s32 channel = 0; s32 channel_band = 0; @@ -9361,12 +9891,8 @@ static s32 wl_escan_handler(struct wl_priv *wl, WL_ERR(("Buffer is too small: ignoring\n")); goto exit; } -#if defined(CUSTOMER_HW4) && defined(DUAL_ESCAN_RESULT_BUFFER) - memcpy(&(wl->escan_info.escan_buf[wl->escan_info.cur_sync_id % 2] - [list->buflen]), bi, bi_length); -#else - memcpy(&(wl->escan_info.escan_buf[list->buflen]), bi, bi_length); -#endif /* CUSTOMER_HW4 && DUAL_ESCAN_RESULT_BUFFER */ + + memcpy(&(((char *)list)[list->buflen]), bi, bi_length); list->version = dtoh32(bi->version); list->buflen += bi_length; list->count++; @@ -9376,12 +9902,9 @@ static s32 wl_escan_handler(struct wl_priv *wl, } else if (status == WLC_E_STATUS_SUCCESS) { wl->escan_info.escan_state = WL_ESCAN_STATE_IDLE; -#if defined(CUSTOMER_HW4) && defined(DUAL_ESCAN_RESULT_BUFFER) - if (escan_result->sync_id != wl->escan_info.cur_sync_id) - WL_ERR(("Escan sync id mismatch: status %d " - "cur_sync_id %d coming_sync_id %d\n", - status, wl->escan_info.cur_sync_id, escan_result->sync_id)); -#endif /* CUSTOMER_HW4 && DUAL_ESCAN_RESULT_BUFFER */ + wl_escan_print_sync_id(status, wl->escan_info.cur_sync_id, + escan_result->sync_id); + if (wl_get_drv_status_all(wl, FINDING_COMMON_CHANNEL)) { WL_INFO(("ACTION FRAME SCAN DONE\n")); wl_clr_p2p_status(wl, SCANNING); @@ -9390,31 +9913,24 @@ static s32 wl_escan_handler(struct wl_priv *wl, complete(&wl->act_frm_scan); } else if ((likely(wl->scan_request)) || (wl->sched_scan_running)) { WL_INFO(("ESCAN COMPLETED\n")); -#if defined(DUAL_ESCAN_RESULT_BUFFER) - wl->bss_list = (wl_scan_results_t *) - wl->escan_info.escan_buf[wl->escan_info.cur_sync_id % 2]; -#else - wl->bss_list = (wl_scan_results_t *)wl->escan_info.escan_buf; -#endif /* CUSTOMER_HW4 && DUAL_ESCAN_RESULT_BUFFER */ - if (wl->scan_request && wl->scan_request->dev != wl->p2p_net) { + wl->bss_list = wl_escan_get_buf(wl, FALSE); + if (!scan_req_match(wl)) { WL_TRACE_HW4(("SCAN COMPLETED: scanned AP count=%d\n", wl->bss_list->count)); } wl_inform_bss(wl); wl_notify_escan_complete(wl, ndev, false, false); } -#if defined(CUSTOMER_HW4) && defined(DUAL_ESCAN_RESULT_BUFFER) - wl->escan_info.cur_sync_id++; -#endif + wl_escan_increment_sync_id(wl, SCAN_BUF_NEXT); +#if defined(CUSTOMER_HW4) && defined(DHD_DEBUG) + if (wl_scan_timeout_dbg_enabled) + wl_scan_timeout_dbg_clear(); +#endif /* CUSTOMER_HW4 && DHD_DEBUG */ } else if (status == WLC_E_STATUS_ABORT) { wl->escan_info.escan_state = WL_ESCAN_STATE_IDLE; -#if defined(CUSTOMER_HW4) && defined(DUAL_ESCAN_RESULT_BUFFER) - if (escan_result->sync_id != wl->escan_info.cur_sync_id) - WL_ERR(("Escan sync id mismatch: status %d " - "cur_sync_id %d coming_sync_id %d\n", - status, wl->escan_info.cur_sync_id, escan_result->sync_id)); -#endif /* CUSTOMER_HW4 && DUAL_ESCAN_RESULT_BUFFER */ + wl_escan_print_sync_id(status, escan_result->sync_id, + wl->escan_info.cur_sync_id); if (wl_get_drv_status_all(wl, FINDING_COMMON_CHANNEL)) { WL_INFO(("ACTION FRAME SCAN DONE\n")); wl_clr_drv_status(wl, SCANNING, wl->afx_hdl->dev); @@ -9423,24 +9939,16 @@ static s32 wl_escan_handler(struct wl_priv *wl, complete(&wl->act_frm_scan); } else if ((likely(wl->scan_request)) || (wl->sched_scan_running)) { WL_INFO(("ESCAN ABORTED\n")); -#if defined(CUSTOMER_HW4) && defined(DUAL_ESCAN_RESULT_BUFFER) - wl->bss_list = (wl_scan_results_t *) - wl->escan_info.escan_buf[(wl->escan_info.cur_sync_id + 1) % 2]; -#else - wl->bss_list = (wl_scan_results_t *)wl->escan_info.escan_buf; -#endif /* CUSTOMER_HW4 && DUAL_ESCAN_RESULT_BUFFER */ - if (wl->scan_request && wl->scan_request->dev != wl->p2p_net) { + wl->bss_list = wl_escan_get_buf(wl, TRUE); + if (!scan_req_match(wl)) { WL_TRACE_HW4(("SCAN ABORTED: scanned AP count=%d\n", wl->bss_list->count)); } wl_inform_bss(wl); wl_notify_escan_complete(wl, ndev, true, false); } -#if defined(CUSTOMER_HW4) && defined(DUAL_ESCAN_RESULT_BUFFER) - wl->escan_info.cur_sync_id += 2; -#endif + wl_escan_increment_sync_id(wl, SCAN_BUF_CNT); } else if (status == WLC_E_STATUS_NEWSCAN) { - escan_result = (wl_escan_result_t *) data; WL_ERR(("WLC_E_STATUS_NEWSCAN : scan_request[%p]\n", wl->scan_request)); WL_ERR(("sync_id[%d], bss_count[%d]\n", escan_result->sync_id, escan_result->bss_count)); @@ -9453,12 +9961,8 @@ static s32 wl_escan_handler(struct wl_priv *wl, } else { WL_ERR(("unexpected Escan Event %d : abort\n", status)); wl->escan_info.escan_state = WL_ESCAN_STATE_IDLE; -#if defined(CUSTOMER_HW4) && defined(DUAL_ESCAN_RESULT_BUFFER) - if (escan_result->sync_id != wl->escan_info.cur_sync_id) - WL_ERR(("Escan sync id mismatch: status %d " - "cur_sync_id %d coming_sync_id %d\n", - status, wl->escan_info.cur_sync_id, escan_result->sync_id)); -#endif /* CUSTOMER_HW4 && DUAL_ESCAN_RESULT_BUFFER */ + wl_escan_print_sync_id(status, escan_result->sync_id, + wl->escan_info.cur_sync_id); if (wl_get_drv_status_all(wl, FINDING_COMMON_CHANNEL)) { WL_INFO(("ACTION FRAME SCAN DONE\n")); wl_clr_p2p_status(wl, SCANNING); @@ -9466,13 +9970,8 @@ static s32 wl_escan_handler(struct wl_priv *wl, if (wl->afx_hdl->peer_chan == WL_INVALID) complete(&wl->act_frm_scan); } else if ((likely(wl->scan_request)) || (wl->sched_scan_running)) { -#if defined(CUSTOMER_HW4) && defined(DUAL_ESCAN_RESULT_BUFFER) - wl->bss_list = (wl_scan_results_t *) - wl->escan_info.escan_buf[(wl->escan_info.cur_sync_id + 1) % 2]; -#else - wl->bss_list = (wl_scan_results_t *)wl->escan_info.escan_buf; -#endif /* CUSTOMER_HW4 && DUAL_ESCAN_RESULT_BUFFER */ - if (wl->scan_request && wl->scan_request->dev != wl->p2p_net) { + wl->bss_list = wl_escan_get_buf(wl, TRUE); + if (!scan_req_match(wl)) { WL_TRACE_HW4(("SCAN ABORTED(UNEXPECTED): " "scanned AP count=%d\n", wl->bss_list->count)); @@ -9480,9 +9979,7 @@ static s32 wl_escan_handler(struct wl_priv *wl, wl_inform_bss(wl); wl_notify_escan_complete(wl, ndev, true, false); } -#if defined(CUSTOMER_HW4) && defined(DUAL_ESCAN_RESULT_BUFFER) - wl->escan_info.cur_sync_id += 2; -#endif + wl_escan_increment_sync_id(wl, 2); } exit: mutex_unlock(&wl->usr_sync); @@ -9507,7 +10004,7 @@ static void wl_cfg80211_concurrent_roam(struct wl_priv *wl, int enable) continue; } if ((err = wldev_iovar_setint(iter->ndev, "roam_off", 1)) != BCME_OK) { - WL_ERR(("%s:failed to set roam_off : %d\n", + WL_ERR((" %s:failed to set roam_off : %d\n", iter->ndev->name, err)); } } @@ -9519,7 +10016,7 @@ static void wl_cfg80211_concurrent_roam(struct wl_priv *wl, int enable) iter->roam_off)) == BCME_OK) iter->roam_off = WL_INVALID; else { - WL_ERR(("%s:failed to set roam_off : %d\n", + WL_ERR((" %s:failed to set roam_off : %d\n", iter->ndev->name, err)); } } @@ -9540,9 +10037,9 @@ static void wl_cfg80211_determine_vsdb_mode(struct wl_priv *wl) return; #else struct net_info *iter, *next; - u32 chan = 0; + u32 ctl_chan = 0; u32 chanspec = 0; - u32 prev_chan = 0; + u32 pre_ctl_chan = 0; u32 connected_cnt = wl_get_drv_status_all(wl, CONNECTED); wl->vsdb_mode = false; @@ -9551,29 +10048,29 @@ static void wl_cfg80211_determine_vsdb_mode(struct wl_priv *wl) } for_each_ndev(wl, iter, next) { chanspec = 0; - chan = 0; + ctl_chan = 0; if (wl_get_drv_status(wl, CONNECTED, iter->ndev)) { if (wldev_iovar_getint(iter->ndev, "chanspec", (s32 *)&chanspec) == BCME_OK) { - chan = CHSPEC_CHANNEL(chanspec); - if (CHSPEC_IS40(chanspec)) { - if (CHSPEC_SB_UPPER(chanspec)) - chan += CH_10MHZ_APART; - else - chan -= CH_10MHZ_APART; - } + chanspec = wl_chspec_driver_to_host(chanspec); + ctl_chan = wf_chspec_ctlchan(chanspec); wl_update_prof(wl, iter->ndev, NULL, - &chan, WL_PROF_CHAN); + &ctl_chan, WL_PROF_CHAN); + } + if (!wl->vsdb_mode) { + if (!pre_ctl_chan && ctl_chan) + pre_ctl_chan = ctl_chan; + else if (pre_ctl_chan && (pre_ctl_chan != ctl_chan)) { + wl->vsdb_mode = true; + } } - if (!prev_chan && chan) - prev_chan = chan; - else if (prev_chan && (prev_chan != chan)) - wl->vsdb_mode = true; } } + WL_ERR(("%s concurrency is enabled\n", wl->vsdb_mode ? "Multi Channel" : "Same Channel")); return; #endif /* CUSTOMER_HW4 */ } + static s32 wl_notifier_change_state(struct wl_priv *wl, struct net_info *_net_info, enum wl_status state, bool set) { @@ -9653,6 +10150,11 @@ static s32 wl_notifier_change_state(struct wl_priv *wl, struct net_info *_net_in WL_ERR(("%s:error (%d)\n", iter->ndev->name, err)); } } + + if (wl->pm_enable_work_on) { + wl_add_remove_pm_enable_work(wl, FALSE, WL_HANDLER_DEL); + } + wl->pm_enable_work_on = true; wl_add_remove_pm_enable_work(wl, TRUE, WL_HANDLER_NOTUSE); } @@ -9717,9 +10219,7 @@ static s32 wl_init_scan(struct wl_priv *wl) } else if (wl->escan_on) { wl->evt_handler[WLC_E_ESCAN_RESULT] = wl_escan_handler; wl->escan_info.escan_state = WL_ESCAN_STATE_IDLE; -#if defined(CUSTOMER_HW4) && defined(DUAL_ESCAN_RESULT_BUFFER) - wl->escan_info.cur_sync_id = 0; -#endif + wl_escan_init_sync_id(wl); } /* Init scan_timeout timer */ init_timer(&wl->scan_timeout); @@ -9761,6 +10261,7 @@ static s32 wl_init_priv(struct wl_priv *wl) return -ENOMEM; wl_init_event_handler(wl); mutex_init(&wl->usr_sync); + mutex_init(&wl->event_sync); err = wl_init_scan(wl); if (err) return err; @@ -9784,7 +10285,7 @@ static void wl_deinit_priv(struct wl_priv *wl) unregister_netdevice_notifier(&wl_cfg80211_netdev_notifier); } -#if defined(WLP2P) && defined(WL_ENABLE_P2P_IF) +#if defined(WL_ENABLE_P2P_IF) || defined(WL_NEWCFG_PRIVCMD_SUPPORT) static s32 wl_cfg80211_attach_p2p(void) { struct wl_priv *wl = wlcfg_drv_priv; @@ -9811,26 +10312,31 @@ static s32 wl_cfg80211_detach_p2p(void) } else wdev = wl->p2p_wdev; +#ifndef WL_NEWCFG_PRIVCMD_SUPPORT if (!wdev) { WL_ERR(("Invalid Ptr\n")); return -EINVAL; } +#endif /* WL_NEWCFG_PRIVCMD_SUPPORT */ wl_cfgp2p_unregister_ndev(wl); wl->p2p_wdev = NULL; wl->p2p_net = NULL; +#ifndef WL_NEWCFG_PRIVCMD_SUPPORT WL_DBG(("Freeing 0x%08x \n", (unsigned int)wdev)); kfree(wdev); +#endif /* WL_NEWCFG_PRIVCMD_SUPPORT */ return 0; } -#endif /* defined(WLP2P) && defined(WL_ENABLE_P2P_IF) */ +#endif /* WL_ENABLE_P2P_IF || WL_NEWCFG_PRIVCMD_SUPPORT */ s32 wl_cfg80211_attach_post(struct net_device *ndev) { struct wl_priv * wl = NULL; s32 err = 0; + s32 ret = 0; WL_TRACE(("In\n")); if (unlikely(!ndev)) { WL_ERR(("ndev is invaild\n")); @@ -9842,21 +10348,21 @@ s32 wl_cfg80211_attach_post(struct net_device *ndev) return -EINVAL; } if (!wl_get_drv_status(wl, READY, ndev)) { - if (wl->wdev && - wl_cfgp2p_supported(wl, ndev)) { + if (wl->wdev) { + ret = wl_cfgp2p_supported(wl, ndev); + if (ret > 0) { #if !defined(WL_ENABLE_P2P_IF) - wl->wdev->wiphy->interface_modes |= + wl->wdev->wiphy->interface_modes |= (BIT(NL80211_IFTYPE_P2P_CLIENT)| BIT(NL80211_IFTYPE_P2P_GO)); -#endif +#endif /* !WL_ENABLE_P2P_IF */ if ((err = wl_cfgp2p_init_priv(wl)) != 0) goto fail; -#if defined(WLP2P) && defined(WL_ENABLE_P2P_IF) +#if defined(WL_ENABLE_P2P_IF) if (wl->p2p_net) { /* Update MAC addr for p2p0 interface here. */ - memcpy(wl->p2p_net->dev_addr, - ndev->dev_addr, ETH_ALEN); + memcpy(wl->p2p_net->dev_addr, ndev->dev_addr, ETH_ALEN); wl->p2p_net->dev_addr[0] |= 0x02; WL_ERR(("%s: p2p_dev_addr="MACDBG "\n", wl->p2p_net->name, @@ -9866,10 +10372,17 @@ s32 wl_cfg80211_attach_post(struct net_device *ndev) " Couldn't update the MAC Address for p2p0 \n")); return -ENODEV; } -#endif /* defined(WLP2P) && (WL_ENABLE_P2P_IF) */ - +#endif /* WL_ENABLE_P2P_IF */ wl->p2p_supported = true; + } else if (ret == 0) { + if ((err = wl_cfgp2p_init_priv(wl)) != 0) + goto fail; + } else { + /* SDIO bus timeout */ + err = -ENODEV; + goto fail; } + } } wl_set_drv_status(wl, READY, ndev); fail: @@ -9896,7 +10409,7 @@ s32 wl_cfg80211_attach(struct net_device *ndev, void *data) WL_ERR(("Could not allocate wireless device\n")); return -ENOMEM; } - err = wl_setup_wiphy(wdev, dev); + err = wl_setup_wiphy(wdev, dev, data); if (unlikely(err)) { kfree(wdev); return -ENOMEM; @@ -9946,11 +10459,11 @@ s32 wl_cfg80211_attach(struct net_device *ndev, void *data) wlcfg_drv_priv = wl; -#if defined(WLP2P) && defined(WL_ENABLE_P2P_IF) +#if defined(WL_ENABLE_P2P_IF) || defined(WL_NEWCFG_PRIVCMD_SUPPORT) err = wl_cfg80211_attach_p2p(); if (err) goto cfg80211_attach_out; -#endif +#endif /* WL_ENABLE_P2P_IF || WL_NEWCFG_PRIVCMD_SUPPORT */ return err; @@ -9982,10 +10495,15 @@ void wl_cfg80211_detach(void *para) del_timer_sync(&wl->p2p->listen_timer); wl_cfgp2p_deinit_priv(wl); } + if (timer_pending(&wl->scan_timeout)) + del_timer_sync(&wl->scan_timeout); -#if defined(WLP2P) && defined(WL_ENABLE_P2P_IF) +#if defined(WL_CFG80211_P2P_DEV_IF) + wl_cfgp2p_del_p2p_disc_if(wl->p2p_wdev); +#endif /* WL_CFG80211_P2P_DEV_IF */ +#if defined(WL_ENABLE_P2P_IF) || defined(WL_NEWCFG_PRIVCMD_SUPPORT) wl_cfg80211_detach_p2p(); -#endif +#endif /* WL_CFG80211_P2P_DEV_IF || WL_NEWCFG_PRIVCMD_SUPPORT */ wl_cfg80211_ibss_vsie_free(wl); wl_deinit_priv(wl); @@ -10005,6 +10523,7 @@ static void wl_wakeup_event(struct wl_priv *wl) } } +#if (defined(WL_CFG80211_P2P_DEV_IF) || defined(WL_ENABLE_P2P_IF)) static int wl_is_p2p_event(struct wl_event_q *e) { switch (e->etype) { @@ -10019,8 +10538,8 @@ static int wl_is_p2p_event(struct wl_event_q *e) case WLC_E_ACTION_FRAME_COMPLETE: if (e->emsg.ifidx != 0) { - WL_TRACE(("P2P Event on Virtual I/F (ifidx:%d) \n", - e->emsg.ifidx)); + WL_TRACE(("P2P event(%d) on virtual interface(ifidx:%d)\n", + e->etype, e->emsg.ifidx)); /* We are only bothered about the P2P events received * on primary interface. For rest of them return false * so that it is sent over the interface corresponding @@ -10028,25 +10547,26 @@ static int wl_is_p2p_event(struct wl_event_q *e) */ return FALSE; } else { - WL_TRACE(("P2P Event on Primary I/F (ifidx:%d)." - " Sent it to p2p0 \n", e->emsg.ifidx)); + WL_TRACE(("P2P event(%d) on interface(ifidx:%d)\n", + e->etype, e->emsg.ifidx)); return TRUE; } break; default: - WL_TRACE(("NON-P2P Event %d on ifidx (ifidx:%d) \n", + WL_TRACE(("NON-P2P event(%d) on interface(ifidx:%d)\n", e->etype, e->emsg.ifidx)); return FALSE; } } +#endif /* BCMDONGLEHOST && (WL_CFG80211_P2P_DEV_IF || WL_ENABLE_P2P_IF) */ static s32 wl_event_handler(void *data) { - struct net_device *netdev; struct wl_priv *wl = NULL; struct wl_event_q *e; tsk_ctl_t *tsk = (tsk_ctl_t *)data; + bcm_struct_cfgdev *cfgdev = NULL; wl = (struct wl_priv *)tsk->parent; @@ -10062,15 +10582,33 @@ static s32 wl_event_handler(void *data) * there is no corresponding bsscfg for P2P interface. Map it to p2p0 * interface. */ +#if defined(WL_CFG80211_P2P_DEV_IF) + if ((wl_is_p2p_event(e) == TRUE) && (wl->p2p_wdev)) { + cfgdev = wl_to_p2p_wdev(wl); + } else { + struct net_device *ndev = NULL; + ndev = dhd_idx2net((struct dhd_pub *)(wl->pub), e->emsg.ifidx); + if (ndev) + cfgdev = ndev_to_wdev(ndev); + } +#elif defined(WL_ENABLE_P2P_IF) if ((wl_is_p2p_event(e) == TRUE) && (wl->p2p_net)) { - netdev = wl->p2p_net; + cfgdev = wl->p2p_net; } else { - netdev = dhd_idx2net((struct dhd_pub *)(wl->pub), e->emsg.ifidx); + cfgdev = dhd_idx2net((struct dhd_pub *)(wl->pub), + e->emsg.ifidx); + } +#endif /* WL_CFG80211_P2P_DEV_IF */ + + if (!cfgdev) { +#if defined(WL_CFG80211_P2P_DEV_IF) + cfgdev = wl_to_prmry_wdev(wl); +#elif defined(WL_ENABLE_P2P_IF) + cfgdev = wl_to_prmry_ndev(wl); +#endif /* WL_CFG80211_P2P_DEV_IF */ } - if (!netdev) - netdev = wl_to_prmry_ndev(wl); if (e->etype < WLC_E_LAST && wl->evt_handler[e->etype]) { - wl->evt_handler[e->etype] (wl, netdev, &e->emsg, e->edata); + wl->evt_handler[e->etype] (wl, cfgdev, &e->emsg, e->edata); } else { WL_DBG(("Unknown Event (%d): ignoring\n", e->etype)); } @@ -10228,14 +10766,79 @@ static s32 wl_config_ifmode(struct wl_priv *wl, struct net_device *ndev, s32 ift return 0; } -s32 wl_add_remove_eventmsg(struct net_device *ndev, u16 event, bool add) +void wl_cfg80211_add_to_eventbuffer(struct wl_eventmsg_buf *ev, u16 event, bool set) { + if (!ev || (event > WLC_E_LAST)) + return; + + if (ev->num < MAX_EVENT_BUF_NUM) { + ev->event[ev->num].type = event; + ev->event[ev->num].set = set; + ev->num++; + } else { + WL_ERR(("evenbuffer doesn't support > %u events. Update" + " the define MAX_EVENT_BUF_NUM \n", MAX_EVENT_BUF_NUM)); + ASSERT(0); + } +} + +s32 wl_cfg80211_apply_eventbuffer( + struct net_device *ndev, + struct wl_priv *wl, + wl_eventmsg_buf_t *ev) +{ + char eventmask[WL_EVENTING_MASK_LEN]; + int i, ret = 0; s8 iovbuf[WL_EVENTING_MASK_LEN + 12]; + if (!ev || (!ev->num)) + return -EINVAL; + + mutex_lock(&wl->event_sync); + + /* Read event_msgs mask */ + bcm_mkiovar("event_msgs", NULL, 0, iovbuf, + sizeof(iovbuf)); + ret = wldev_ioctl(ndev, WLC_GET_VAR, iovbuf, sizeof(iovbuf), false); + if (unlikely(ret)) { + WL_ERR(("Get event_msgs error (%d)\n", ret)); + goto exit; + } + memcpy(eventmask, iovbuf, WL_EVENTING_MASK_LEN); + + /* apply the set bits */ + for (i = 0; i < ev->num; i++) { + if (ev->event[i].set) + setbit(eventmask, ev->event[i].type); + else + clrbit(eventmask, ev->event[i].type); + } + + /* Write updated Event mask */ + bcm_mkiovar("event_msgs", eventmask, WL_EVENTING_MASK_LEN, iovbuf, + sizeof(iovbuf)); + ret = wldev_ioctl(ndev, WLC_SET_VAR, iovbuf, sizeof(iovbuf), true); + if (unlikely(ret)) { + WL_ERR(("Set event_msgs error (%d)\n", ret)); + } + +exit: + mutex_unlock(&wl->event_sync); + return ret; +} + +s32 wl_add_remove_eventmsg(struct net_device *ndev, u16 event, bool add) +{ + s8 iovbuf[WL_EVENTING_MASK_LEN + 12]; s8 eventmask[WL_EVENTING_MASK_LEN]; s32 err = 0; - if (!ndev) + struct wl_priv *wl = wlcfg_drv_priv; + + if (!ndev || !wl) return -ENODEV; + + mutex_lock(&wl->event_sync); + /* Setup event_msgs */ bcm_mkiovar("event_msgs", NULL, 0, iovbuf, sizeof(iovbuf)); @@ -10259,8 +10862,8 @@ s32 wl_add_remove_eventmsg(struct net_device *ndev, u16 event, bool add) } eventmsg_out: + mutex_unlock(&wl->event_sync); return err; - } static int wl_construct_reginfo(struct wl_priv *wl, s32 bw_cap) @@ -10391,8 +10994,10 @@ static int wl_construct_reginfo(struct wl_priv *wl, s32 bw_cap) if (channel & WL_CHAN_PASSIVE) band_chan_arr[index].flags |= IEEE80211_CHAN_PASSIVE_SCAN; - } else if (err == BCME_UNSUPPORTED) + } else if (err == BCME_UNSUPPORTED) { dfs_radar_disabled = TRUE; + WL_ERR(("does not support per_chan_info\n")); + } } } if (!update) @@ -10406,7 +11011,7 @@ static int wl_construct_reginfo(struct wl_priv *wl, s32 bw_cap) return err; } -s32 wl_update_wiphybands(struct wl_priv *wl) +s32 wl_update_wiphybands(struct wl_priv *wl, bool notify) { struct wiphy *wiphy; struct net_device *dev; @@ -10432,7 +11037,7 @@ s32 wl_update_wiphybands(struct wl_priv *wl) err = wldev_ioctl(dev, WLC_GET_BANDLIST, bandlist, sizeof(bandlist), false); if (unlikely(err)) { - WL_ERR(("error real bandlist (%d)\n", err)); + WL_ERR(("error read bandlist (%d)\n", err)); goto end_bands; } err = wldev_ioctl(dev, WLC_GET_BAND, &cur_band, @@ -10495,7 +11100,16 @@ s32 wl_update_wiphybands(struct wl_priv *wl) wiphy->bands[IEEE80211_BAND_2GHZ] = bands[IEEE80211_BAND_2GHZ]; wiphy->bands[IEEE80211_BAND_5GHZ] = bands[IEEE80211_BAND_5GHZ]; - wiphy_apply_custom_regulatory(wiphy, &brcm_regdom); + /* check if any bands populated otherwise makes 2Ghz as default */ + if (wiphy->bands[IEEE80211_BAND_2GHZ] == NULL && + wiphy->bands[IEEE80211_BAND_5GHZ] == NULL) { + /* Setup 2Ghz band as default */ + wiphy->bands[IEEE80211_BAND_2GHZ] = &__wl_band_2ghz; + } + + if (notify) + wiphy_apply_custom_regulatory(wiphy, &brcm_regdom); + end_bands: if (rollback_lock) mutex_unlock(&wl->usr_sync); @@ -10521,7 +11135,7 @@ static s32 __wl_cfg80211_up(struct wl_priv *wl) if (unlikely(err && err != -EINPROGRESS)) { WL_ERR(("wl_config_ifmode failed\n")); } - err = wl_update_wiphybands(wl); + err = wl_update_wiphybands(wl, true); if (unlikely(err)) { WL_ERR(("wl_update_wiphybands failed\n")); } @@ -10544,6 +11158,7 @@ static s32 __wl_cfg80211_up(struct wl_priv *wl) } } #endif /* WL_HOST_BAND_MGMT */ + INIT_DELAYED_WORK(&wl->pm_enable_work, wl_cfg80211_work_handler); wl_set_drv_status(wl, READY, ndev); return err; @@ -10555,9 +11170,10 @@ static s32 __wl_cfg80211_down(struct wl_priv *wl) unsigned long flags; struct net_info *iter, *next; struct net_device *ndev = wl_to_prmry_ndev(wl); -#if defined(WL_CFG80211) && defined(SUPPORT_DEEP_SLEEP) +#if defined(WL_CFG80211) && (defined(WL_ENABLE_P2P_IF) || \ + defined(WL_NEWCFG_PRIVCMD_SUPPORT)) struct net_device *p2p_net = wl->p2p_net; -#endif +#endif /* WL_CFG80211 && (WL_ENABLE_P2P_IF || WL_NEWCFG_PRIVCMD_SUPPORT) */ u32 bssidx = 0; #ifdef PROP_TXSTATUS_VSDB dhd_pub_t *dhd = (dhd_pub_t *)(wl->pub); @@ -10570,15 +11186,19 @@ static s32 __wl_cfg80211_down(struct wl_priv *wl) wl_clr_p2p_status(wl, GO_NEG_PHASE); #ifdef PROP_TXSTATUS_VSDB if (wl->p2p->vif_created) { - if (dhd->wlfc_enabled && wl->wlfc_on) { + if (dhd-> op_mode != DHD_FLAG_IBSS_MODE && + dhd->wlfc_enabled && wl->wlfc_on) { dhd->wlfc_enabled = false; dhd_wlfc_deinit(dhd); + if (dhd->plat_deinit) + dhd->plat_deinit((void *)dhd); wl->wlfc_on = false; } } #endif /* PROP_TXSTATUS_VSDB */ } + /* If primary BSS is operational (for e.g SoftAP), bring it down */ if (!(wl_cfgp2p_find_idx(wl, ndev, &bssidx)) && wl_cfgp2p_bss_isup(ndev, bssidx)) { @@ -10613,12 +11233,14 @@ static s32 __wl_cfg80211_down(struct wl_priv *wl) } wl_to_prmry_ndev(wl)->ieee80211_ptr->iftype = NL80211_IFTYPE_STATION; -#if defined(WL_CFG80211) && defined(SUPPORT_DEEP_SLEEP) - if (!trigger_deep_sleep) { +#if defined(WL_CFG80211) && (defined(WL_ENABLE_P2P_IF) || \ + defined(WL_NEWCFG_PRIVCMD_SUPPORT)) +#ifdef SUPPORT_DEEP_SLEEP + if (!trigger_deep_sleep) +#endif /* SUPPORT_DEEP_SLEEP */ if (p2p_net) dev_close(p2p_net); - } -#endif +#endif /* WL_CFG80211 && (WL_ENABLE_P2P_IF || WL_NEWCFG_PRIVCMD_SUPPORT) */ DNGL_FUNC(dhd_cfg80211_down, (wl)); wl_flush_eq(wl); wl_link_down(wl); @@ -10835,6 +11457,29 @@ static __used s32 wl_add_ie(struct wl_priv *wl, u8 t, u8 l, u8 *v) return err; } +static void wl_update_hidden_ap_ie(struct wl_bss_info *bi, u8 *ie_stream, u32 *ie_size) +{ + u8 *ssidie; + ssidie = (u8 *)cfg80211_find_ie(WLAN_EID_SSID, ie_stream, *ie_size); + if (!ssidie) + return; + if (ssidie[1] != bi->SSID_len) { + if (ssidie[1]) { + WL_ERR(("%s: Wrong SSID len: %d != %d\n", + __FUNCTION__, ssidie[1], bi->SSID_len)); + return; + } + memmove(ssidie + bi->SSID_len + 2, ssidie + 2, *ie_size - (ssidie + 2 - ie_stream)); + memcpy(ssidie + 2, bi->SSID, bi->SSID_len); + *ie_size = *ie_size + bi->SSID_len; + ssidie[1] = bi->SSID_len; + return; + } + if (*(ssidie + 2) == '\0') + memcpy(ssidie + 2, bi->SSID, bi->SSID_len); + return; +} + static s32 wl_mrg_ie(struct wl_priv *wl, u8 *ie_stream, u16 ie_size) { struct wl_ie *ie = wl_to_ie(wl); @@ -10975,12 +11620,18 @@ s32 wl_cfg80211_channel_to_freq(u32 channel) return freq; } + +#ifdef WLTDLS static s32 -wl_tdls_event_handler(struct wl_priv *wl, struct net_device *ndev, +wl_tdls_event_handler(struct wl_priv *wl, bcm_struct_cfgdev *cfgdev, const wl_event_msg_t *e, void *data) { + struct net_device *ndev = NULL; u32 reason = ntoh32(e->reason); s8 *msg = NULL; + + ndev = cfgdev_to_wlc_ndev(cfgdev, wl); + switch (reason) { case WLC_E_TDLS_PEER_DISCOVERED : msg = " TDLS PEER DISCOVERD "; @@ -10999,43 +11650,58 @@ wl_tdls_event_handler(struct wl_priv *wl, struct net_device *ndev, return 0; } -#if LINUX_VERSION_CODE > KERNEL_VERSION(3, 2, 0) +#endif /* WLTDLS */ + +#if (LINUX_VERSION_CODE > KERNEL_VERSION(3, 2, 0)) || defined(WL_COMPAT_WIRELESS) static s32 wl_cfg80211_tdls_oper(struct wiphy *wiphy, struct net_device *dev, u8 *peer, enum nl80211_tdls_operation oper) { s32 ret = 0; #ifdef WLTDLS - struct wl_priv *wl; + struct wl_priv *wl = wlcfg_drv_priv; tdls_iovar_t info; - wl = wlcfg_drv_priv; memset(&info, 0, sizeof(tdls_iovar_t)); if (peer) memcpy(&info.ea, peer, ETHER_ADDR_LEN); switch (oper) { case NL80211_TDLS_DISCOVERY_REQ: + /* turn on TDLS */ + ret = dhd_tdls_enable(dev, true, false, NULL); + if (ret < 0) + return ret; info.mode = TDLS_MANUAL_EP_DISCOVERY; break; case NL80211_TDLS_SETUP: - info.mode = TDLS_MANUAL_EP_CREATE; + /* auto mode on */ + ret = dhd_tdls_enable(dev, true, true, (struct ether_addr *)peer); + if (ret < 0) + return ret; break; case NL80211_TDLS_TEARDOWN: info.mode = TDLS_MANUAL_EP_DELETE; + /* auto mode off */ + ret = dhd_tdls_enable(dev, true, false, (struct ether_addr *)peer); + if (ret < 0) + return ret; break; default: WL_ERR(("Unsupported operation : %d\n", oper)); goto out; } - ret = wldev_iovar_setbuf(dev, "tdls_endpoint", &info, sizeof(info), - wl->ioctl_buf, WLC_IOCTL_MAXLEN, &wl->ioctl_buf_sync); - if (ret) { - WL_ERR(("tdls_endpoint error %d\n", ret)); + + if (info.mode) { + ret = wldev_iovar_setbuf(dev, "tdls_endpoint", &info, sizeof(info), + wl->ioctl_buf, WLC_IOCTL_MAXLEN, &wl->ioctl_buf_sync); + if (ret) { + WL_ERR(("tdls_endpoint error %d\n", ret)); + } } out: #endif /* WLTDLS */ return ret; } -#endif /* LINUX_VERSION_CODE > KERNEL_VERSION(3, 2, 0) */ +#endif /* LINUX_VERSION > VERSION(3,2,0) || WL_COMPAT_WIRELESS */ s32 wl_cfg80211_set_wps_p2p_ie(struct net_device *net, char *buf, int len, enum wl_management_type type) @@ -11057,9 +11723,7 @@ s32 wl_cfg80211_set_wps_p2p_ie(struct net_device *net, char *buf, int len, ndev = net; bssidx = 0; } else if (wl->p2p) { - if (net == wl->p2p_net) { - net = wl_to_prmry_ndev(wl); - } + net = ndev_to_wlc_ndev(net, wl); if (!wl->p2p->on) { get_primary_mac(wl, &primary_mac); wl_cfgp2p_generate_bss_mac(&primary_mac, &wl->p2p->dev_addr, @@ -11104,6 +11768,328 @@ s32 wl_cfg80211_set_wps_p2p_ie(struct net_device *net, char *buf, int len, return ret; } +#ifdef WL_SUPPORT_AUTO_CHANNEL +static s32 +wl_cfg80211_set_auto_channel_scan_state(struct net_device *ndev) +{ + u32 val = 0; + s32 ret = BCME_ERROR; + struct wl_priv *wl = wlcfg_drv_priv; + + /* Disable mpc, to avoid automatic interface down. */ + val = 0; + + ret = wldev_iovar_setbuf_bsscfg(ndev, "mpc", (void *)&val, + sizeof(val), wl->ioctl_buf, WLC_IOCTL_SMLEN, 0, + &wl->ioctl_buf_sync); + if (ret < 0) { + WL_ERR(("set 'mpc' failed, error = %d\n", ret)); + goto done; + } + + /* Set interface up, explicitly. */ + val = 1; + + ret = wldev_ioctl(ndev, WLC_UP, (void *)&val, sizeof(val), true); + if (ret < 0) { + WL_ERR(("set interface up failed, error = %d\n", ret)); + goto done; + } + + /* Stop all scan explicitly, till auto channel selection complete. */ + wl_set_drv_status(wl, SCANNING, ndev); + if (wl->escan_info.ndev == NULL) { + ret = BCME_OK; + goto done; + } + ret = wl_notify_escan_complete(wl, ndev, true, true); + if (ret < 0) { + WL_ERR(("set scan abort failed, error = %d\n", ret)); + goto done; + } + +done: + return ret; +} + +static bool +wl_cfg80211_valid_chanspec_p2p(chanspec_t chanspec) +{ + bool valid = false; + + /* channel 1 to 14 */ + if ((chanspec >= 0x2b01) && (chanspec <= 0x2b0e)) { + valid = true; + } + /* channel 36 to 48 */ + else if ((chanspec >= 0x1b24) && (chanspec <= 0x1b30)) { + valid = true; + } + /* channel 149 to 161 */ + else if ((chanspec >= 0x1b95) && (chanspec <= 0x1ba1)) { + valid = true; + } + else { + valid = false; + WL_INFO(("invalid P2P chanspec, channel = %d, chanspec = %04x\n", + CHSPEC_CHANNEL(chanspec), chanspec)); + } + + return valid; +} + +static s32 +wl_cfg80211_get_chanspecs_2g(struct net_device *ndev, void *buf, s32 buflen) +{ + s32 ret = BCME_ERROR; + struct wl_priv *wl = NULL; + wl_uint32_list_t *list = NULL; + chanspec_t chanspec = 0; + + memset(buf, 0, buflen); + + wl = wlcfg_drv_priv; + list = (wl_uint32_list_t *)buf; + list->count = htod32(WL_NUMCHANSPECS); + + /* Restrict channels to 2.4GHz, 20MHz BW, no SB. */ + chanspec |= (WL_CHANSPEC_BAND_2G | WL_CHANSPEC_BW_20 | + WL_CHANSPEC_CTL_SB_NONE); + chanspec = wl_chspec_host_to_driver(chanspec); + + ret = wldev_iovar_getbuf_bsscfg(ndev, "chanspecs", (void *)&chanspec, + sizeof(chanspec), buf, buflen, 0, &wl->ioctl_buf_sync); + if (ret < 0) { + WL_ERR(("get 'chanspecs' failed, error = %d\n", ret)); + } + + return ret; +} + +static s32 +wl_cfg80211_get_chanspecs_5g(struct net_device *ndev, void *buf, s32 buflen) +{ + u32 channel = 0; + s32 ret = BCME_ERROR; + s32 i = 0; + s32 j = 0; + struct wl_priv *wl = NULL; + wl_uint32_list_t *list = NULL; + chanspec_t chanspec = 0; + + memset(buf, 0, buflen); + + wl = wlcfg_drv_priv; + list = (wl_uint32_list_t *)buf; + list->count = htod32(WL_NUMCHANSPECS); + + /* Restrict channels to 5GHz, 20MHz BW, no SB. */ + chanspec |= (WL_CHANSPEC_BAND_5G | WL_CHANSPEC_BW_20 | + WL_CHANSPEC_CTL_SB_NONE); + chanspec = wl_chspec_host_to_driver(chanspec); + + ret = wldev_iovar_getbuf_bsscfg(ndev, "chanspecs", (void *)&chanspec, + sizeof(chanspec), buf, buflen, 0, &wl->ioctl_buf_sync); + if (ret < 0) { + WL_ERR(("get 'chanspecs' failed, error = %d\n", ret)); + goto done; + } + + /* Skip DFS and inavlid P2P channel. */ + for (i = 0, j = 0; i < dtoh32(list->count); i++) { + chanspec = (chanspec_t) dtoh32(list->element[i]); + channel = CHSPEC_CHANNEL(chanspec); + + ret = wldev_iovar_getint(ndev, "per_chan_info", &channel); + if (ret < 0) { + WL_ERR(("get 'per_chan_info' failed, error = %d\n", ret)); + goto done; + } + + if (CHANNEL_IS_RADAR(channel) || + !(wl_cfg80211_valid_chanspec_p2p(chanspec))) { + continue; + } else { + list->element[j] = list->element[i]; + } + + j++; + } + + list->count = j; + +done: + return ret; +} + +static s32 +wl_cfg80211_get_best_channel(struct net_device *ndev, void *buf, int buflen, + int *channel) +{ + s32 ret = BCME_ERROR; + int chosen = 0; + int retry = 0; + + /* Start auto channel selection scan. */ + ret = wldev_ioctl(ndev, WLC_START_CHANNEL_SEL, buf, buflen, true); + if (ret < 0) { + WL_ERR(("can't start auto channel scan, error = %d\n", ret)); + *channel = 0; + goto done; + } + + /* Wait for auto channel selection, worst case possible delay is 5250ms. */ + retry = CHAN_SEL_RETRY_COUNT; + + while (retry--) { + OSL_SLEEP(CHAN_SEL_IOCTL_DELAY); + + ret = wldev_ioctl(ndev, WLC_GET_CHANNEL_SEL, &chosen, sizeof(chosen), + false); + if ((ret == 0) && (dtoh32(chosen) != 0)) { + *channel = (u16)(chosen & 0x00FF); + WL_INFO(("selected channel = %d\n", *channel)); + break; + } + WL_INFO(("attempt = %d, ret = %d, chosen = %d\n", + (CHAN_SEL_RETRY_COUNT - retry), ret, dtoh32(chosen))); + } + + if (retry <= 0) { + WL_ERR(("failure, auto channel selection timed out\n")); + *channel = 0; + ret = BCME_ERROR; + } + +done: + return ret; +} + +static s32 +wl_cfg80211_restore_auto_channel_scan_state(struct net_device *ndev) +{ + u32 val = 0; + s32 ret = BCME_ERROR; + struct wl_priv *wl = wlcfg_drv_priv; + + /* Clear scan stop driver status. */ + wl_clr_drv_status(wl, SCANNING, ndev); + + /* Enable mpc back to 1, irrespective of initial state. */ + val = 1; + + ret = wldev_iovar_setbuf_bsscfg(ndev, "mpc", (void *)&val, + sizeof(val), wl->ioctl_buf, WLC_IOCTL_SMLEN, 0, + &wl->ioctl_buf_sync); + if (ret < 0) { + WL_ERR(("set 'mpc' failed, error = %d\n", ret)); + } + + return ret; +} + +s32 +wl_cfg80211_get_best_channels(struct net_device *dev, char* cmd, int total_len) +{ + int channel = 0; + s32 ret = BCME_ERROR; + u8 *buf = NULL; + char *pos = cmd; + struct wl_priv *wl = NULL; + struct net_device *ndev = NULL; + + memset(cmd, 0, total_len); + + buf = kmalloc(CHANSPEC_BUF_SIZE, GFP_KERNEL); + if (buf == NULL) { + WL_ERR(("failed to allocate chanspec buffer\n")); + return -ENOMEM; + } + + /* + * Always use primary interface, irrespective of interface on which + * command came. + */ + wl = wlcfg_drv_priv; + ndev = wl_to_prmry_ndev(wl); + + /* + * Make sure that FW and driver are in right state to do auto channel + * selection scan. + */ + ret = wl_cfg80211_set_auto_channel_scan_state(ndev); + if (ret < 0) { + WL_ERR(("can't set auto channel scan state, error = %d\n", ret)); + goto done; + } + + /* Best channel selection in 2.4GHz band. */ + ret = wl_cfg80211_get_chanspecs_2g(ndev, (void *)buf, CHANSPEC_BUF_SIZE); + if (ret < 0) { + WL_ERR(("can't get chanspecs in 2.4GHz, error = %d\n", ret)); + goto done; + } + + ret = wl_cfg80211_get_best_channel(ndev, (void *)buf, CHANSPEC_BUF_SIZE, + &channel); + if (ret < 0) { + WL_ERR(("can't select best channel scan in 2.4GHz, error = %d\n", ret)); + goto done; + } + + if (CHANNEL_IS_2G(channel)) { + channel = ieee80211_channel_to_frequency(channel, IEEE80211_BAND_2GHZ); + } else { + WL_ERR(("invalid 2.4GHz channel, channel = %d\n", channel)); + channel = 0; + } + + sprintf(pos, "%04d ", channel); + pos += 5; + + /* Best channel selection in 5GHz band. */ + ret = wl_cfg80211_get_chanspecs_5g(ndev, (void *)buf, CHANSPEC_BUF_SIZE); + if (ret < 0) { + WL_ERR(("can't get chanspecs in 5GHz, error = %d\n", ret)); + goto done; + } + + ret = wl_cfg80211_get_best_channel(ndev, (void *)buf, CHANSPEC_BUF_SIZE, + &channel); + if (ret < 0) { + WL_ERR(("can't select best channel scan in 5GHz, error = %d\n", ret)); + goto done; + } + + if (CHANNEL_IS_5G(channel)) { + channel = ieee80211_channel_to_frequency(channel, IEEE80211_BAND_5GHZ); + } else { + WL_ERR(("invalid 5GHz channel, channel = %d\n", channel)); + channel = 0; + } + + sprintf(pos, "%04d ", channel); + pos += 5; + + /* Set overall best channel same as 5GHz best channel. */ + sprintf(pos, "%04d ", channel); + pos += 5; + +done: + if (NULL != buf) { + kfree(buf); + } + + /* Restore FW and driver back to normal state. */ + ret = wl_cfg80211_restore_auto_channel_scan_state(ndev); + if (ret < 0) { + WL_ERR(("can't restore auto channel scan state, error = %d\n", ret)); + } + + return (pos - cmd); +} +#endif /* WL_SUPPORT_AUTO_CHANNEL */ + static const struct rfkill_ops wl_rfkill_ops = { .set_block = wl_rfkill_set }; @@ -11157,6 +12143,7 @@ static int wl_setup_rfkill(struct wl_priv *wl, bool setup) err_out: return err; } + #ifdef DEBUGFS_CFG80211 /** * Format : echo "SCAN:1 DBG:1" > /sys/kernel/debug/dhd/debug_level @@ -11278,6 +12265,7 @@ static s32 wl_free_debugfs(struct wl_priv *wl) return 0; } #endif /* DEBUGFS_CFG80211 */ + struct device *wl_cfg80211_get_parent_dev(void) { return cfg80211_parent_dev; @@ -11293,13 +12281,12 @@ static void wl_cfg80211_clear_parent_dev(void) cfg80211_parent_dev = NULL; } -static void get_primary_mac(struct wl_priv *wl, struct ether_addr *mac) +void get_primary_mac(struct wl_priv *wl, struct ether_addr *mac) { wldev_iovar_getbuf_bsscfg(wl_to_prmry_ndev(wl), "cur_etheraddr", NULL, 0, wl->ioctl_buf, WLC_IOCTL_SMLEN, 0, &wl->ioctl_buf_sync); memcpy(mac->octet, wl->ioctl_buf, ETHER_ADDR_LEN); } - static bool check_dev_role_integrity(struct wl_priv *wl, u32 dev_role) { dhd_pub_t *dhd = (dhd_pub_t *)(wl->pub); @@ -11338,7 +12325,7 @@ void wl_cfg80211_enable_trace(bool set, u32 level) 2, 0)) static s32 wl_cfg80211_mgmt_tx_cancel_wait(struct wiphy *wiphy, - struct net_device *dev, u64 cookie) + bcm_struct_cfgdev *cfgdev, u64 cookie) { /* CFG80211 checks for tx_cancel_wait callback when ATTR_DURATION * is passed with CMD_FRAME. This callback is supposed to cancel @@ -11472,6 +12459,7 @@ wl_cfg80211_set_band(struct net_device *ndev, int band) } #endif /* WL_HOST_BAND_MGMT */ + static void wl_cfg80211_work_handler(struct work_struct * work) { struct wl_priv *wl = NULL; @@ -11532,3 +12520,27 @@ wl_get_public_action(void *frame, u32 frame_len, u8 *ret_action) WL_INFO(("Public Action : %d\n", *ret_action)); return BCME_OK; } +#ifdef BCMCCX_S69 +static s32 +wl_ccx_s69_response(struct wl_priv *wl, bcm_struct_cfgdev *cfgdev, + const wl_event_msg_t *e, void *data) +{ + struct net_device *ndev = NULL; + u32 event = ntoh32(e->event_type); + u32 datalen = ntoh32(e->datalen); + s32 err; + + ndev = cfgdev_to_wlc_ndev(cfgdev, wl); + err = wl_genl_send_msg(ndev, event, data, (u16)datalen, 0, 0); + + return err; +} +#endif /* BCMCCX_S69 */ + +#ifdef WLFBT +void +wl_get_fbt_key(uint8 *key) +{ + memcpy(key, wlcfg_drv_priv->fbt_key, FBT_KEYLEN); +} +#endif /* WLFBT */ diff --git a/drivers/net/wireless/bcmdhd/wl_cfg80211.h b/drivers/net/wireless/bcmdhd/wl_cfg80211.h index 71b2da15b80..568135a115d 100644 --- a/drivers/net/wireless/bcmdhd/wl_cfg80211.h +++ b/drivers/net/wireless/bcmdhd/wl_cfg80211.h @@ -1,7 +1,7 @@ /* * Linux cfg80211 driver * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -21,7 +21,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: wl_cfg80211.h 423745 2013-09-13 04:48:46Z $ + * $Id: wl_cfg80211.h 440872 2013-12-04 05:25:35Z $ */ #ifndef _wl_cfg80211_h_ @@ -125,7 +125,7 @@ do { \ if (wl_dbg_level & WL_DBG_ERR) { \ printk(KERN_INFO "CFG80211-TRACE) %s : ", __func__); \ printk args; \ - } \ + } \ } while (0) #else #define WL_TRACE_HW4 WL_TRACE @@ -148,11 +148,11 @@ do { \ #define WL_SCAN_RETRY_MAX 3 #define WL_NUM_PMKIDS_MAX MAXPMKID #define WL_SCAN_BUF_MAX (1024 * 8) -#define WL_TLV_INFO_MAX 1500 +#define WL_TLV_INFO_MAX 1500 #define WL_SCAN_IE_LEN_MAX 2048 #define WL_BSS_INFO_MAX 2048 #define WL_ASSOC_INFO_MAX 512 -#define WL_IOCTL_LEN_MAX 1024 +#define WL_IOCTL_LEN_MAX 2048 #define WL_EXTRA_BUF_MAX 2048 #define WL_ISCAN_BUF_MAX 2048 #define WL_ISCAN_TIMER_INTERVAL_MS 3000 @@ -164,16 +164,16 @@ do { \ #define WL_MIN_DWELL_TIME 100 #define WL_LONG_DWELL_TIME 1000 #define IFACE_MAX_CNT 2 -#define WL_SCAN_CONNECT_DWELL_TIME_MS 300 -#define WL_SCAN_JOIN_PROBE_INTERVAL_MS 60 -#define WL_SCAN_JOIN_ACTIVE_DWELL_TIME_MS 320 -#define WL_SCAN_JOIN_PASSIVE_DWELL_TIME_MS 400 -#define WL_AF_TX_MAX_RETRY 5 +#define WL_SCAN_CONNECT_DWELL_TIME_MS 200 +#define WL_SCAN_JOIN_PROBE_INTERVAL_MS 20 +#define WL_SCAN_JOIN_ACTIVE_DWELL_TIME_MS 320 +#define WL_SCAN_JOIN_PASSIVE_DWELL_TIME_MS 400 +#define WL_AF_TX_MAX_RETRY 5 -#define WL_AF_SEARCH_TIME_MAX 450 -#define WL_AF_TX_EXTRA_TIME_MAX 200 +#define WL_AF_SEARCH_TIME_MAX 450 +#define WL_AF_TX_EXTRA_TIME_MAX 200 -#define WL_SCAN_TIMER_INTERVAL_MS 8000 /* Scan timeout */ +#define WL_SCAN_TIMER_INTERVAL_MS 10000 /* Scan timeout */ #define WL_CHANNEL_SYNC_RETRY 5 #define WL_INVALID -1 @@ -182,6 +182,10 @@ do { \ #define WL_SCB_TIMEOUT 20 #endif +/* SCAN_SUPPRESS timer values in ms */ +#define WL_SCAN_SUPPRESS_TIMEOUT 31000 /* default Framwork DHCP timeout is 30 sec */ +#define WL_SCAN_SUPPRESS_RETRY 3000 + #define WL_PM_ENABLE_TIMEOUT 10000 /* driver status */ @@ -292,8 +296,8 @@ struct wl_conf { struct ieee80211_channel channel; }; -typedef s32(*EVENT_HANDLER) (struct wl_priv *wl, - struct net_device *ndev, const wl_event_msg_t *e, void *data); +typedef s32(*EVENT_HANDLER) (struct wl_priv *wl, bcm_struct_cfgdev *cfgdev, + const wl_event_msg_t *e, void *data); /* bss inform structure for cfg80211 interface */ struct wl_cfg80211_bss_info { @@ -503,14 +507,26 @@ struct parsed_ies { #ifdef WL11U /* Max length of Interworking element */ -#define IW_IES_MAX_BUF_LEN 9 +#define IW_IES_MAX_BUF_LEN 9 +#endif +#ifdef WLFBT +#define FBT_KEYLEN 32 #endif +#define MAX_EVENT_BUF_NUM 16 +typedef struct wl_eventmsg_buf { + u16 num; + struct { + u16 type; + bool set; + } event [MAX_EVENT_BUF_NUM]; +} wl_eventmsg_buf_t; /* private data of cfg80211 interface */ struct wl_priv { struct wireless_dev *wdev; /* representing wl cfg80211 device */ struct wireless_dev *p2p_wdev; /* representing wl cfg80211 device for P2P */ + struct net_device *p2p_net; /* reference to p2p0 interface */ struct wl_conf *conf; @@ -543,7 +559,9 @@ struct wl_priv { #else struct wl_connect_info conn_info; #endif +#ifdef DEBUGFS_CFG80211 struct dentry *debugfs; +#endif /* DEBUGFS_CFG80211 */ struct wl_pmk_list *pmk_list; /* wpa2 pmk list */ tsk_ctl_t event_tsk; /* task of main event handler thread */ void *pub; @@ -610,10 +628,22 @@ struct wl_priv { #ifdef WL_HOST_BAND_MGMT u8 curr_band; #endif /* WL_HOST_BAND_MGMT */ + bool scan_suppressed; + struct timer_list scan_supp_timer; + struct work_struct wlan_work; + struct mutex event_sync; /* maily for up/down synchronization */ bool pm_enable_work_on; struct delayed_work pm_enable_work; vndr_ie_setbuf_t *ibss_vsie; /* keep the VSIE for IBSS */ int ibss_vsie_len; +#ifdef WLAIBSS + u32 aibss_txfail_pid; + u32 aibss_txfail_seq; +#endif /* WLAIBSS */ + +#ifdef WLFBT + uint8 fbt_key[FBT_KEYLEN]; +#endif }; @@ -804,7 +834,47 @@ wl_get_netinfo_by_netdev(struct wl_priv *wl, struct net_device *ndev) } #define wl_to_wiphy(w) (w->wdev->wiphy) #define wl_to_prmry_ndev(w) (w->wdev->netdev) +#define wl_to_prmry_wdev(w) (w->wdev) +#define wl_to_p2p_wdev(w) (w->p2p_wdev) #define ndev_to_wl(n) (wdev_to_wl(n->ieee80211_ptr)) +#define ndev_to_wdev(ndev) (ndev->ieee80211_ptr) +#define wdev_to_ndev(wdev) (wdev->netdev) + +#if defined(WL_ENABLE_P2P_IF) +#define ndev_to_wlc_ndev(ndev, wl) ((ndev == wl->p2p_net) ? \ + wl_to_prmry_ndev(wl) : ndev) +#else +#define ndev_to_wlc_ndev(ndev, wl) (ndev) +#endif /* WL_ENABLE_P2P_IF */ + +#if defined(WL_CFG80211_P2P_DEV_IF) +#define wdev_to_wlc_ndev(wdev, wl) \ + ((wdev->iftype == NL80211_IFTYPE_P2P_DEVICE) ? \ + wl_to_prmry_ndev(wl) : wdev_to_ndev(wdev)) +#define cfgdev_to_wlc_ndev(cfgdev, wl) wdev_to_wlc_ndev(cfgdev, wl) +#elif defined(WL_ENABLE_P2P_IF) +#define cfgdev_to_wlc_ndev(cfgdev, wl) ndev_to_wlc_ndev(cfgdev, wl) +#else +#define cfgdev_to_wlc_ndev(cfgdev, wl) (cfgdev) +#endif /* WL_CFG80211_P2P_DEV_IF */ + +#if defined(WL_CFG80211_P2P_DEV_IF) +#define ndev_to_cfgdev(ndev) ndev_to_wdev(ndev) +#else +#define ndev_to_cfgdev(ndev) (ndev) +#endif /* WL_CFG80211_P2P_DEV_IF */ + +#if defined(WL_CFG80211_P2P_DEV_IF) +#define scan_req_match(wl) (((wl) && (wl->scan_request) && \ + (wl->scan_request->wdev == wl->p2p_wdev)) ? true : false) +#elif defined(WL_ENABLE_P2P_IF) +#define scan_req_match(wl) (((wl) && (wl->scan_request) && \ + (wl->scan_request->dev == wl->p2p_net)) ? true : false) +#else +#define scan_req_match(wl) (((wl) && p2p_is_on(wl) && p2p_scan(wl)) ? \ + true : false) +#endif /* WL_CFG80211_P2P_DEV_IF */ + #define wl_to_sr(w) (w->scan_req_int) #if defined(STATIC_WL_PRIV_STRUCT) #define wl_to_ie(w) (w->ie) @@ -869,22 +939,81 @@ extern s32 wl_cfg80211_get_p2p_noa(struct net_device *net, char* buf, int len); extern s32 wl_cfg80211_set_wps_p2p_ie(struct net_device *net, char *buf, int len, enum wl_management_type type); extern s32 wl_cfg80211_set_p2p_ps(struct net_device *net, char* buf, int len); +#ifdef WL_SUPPORT_AUTO_CHANNEL +#define CHANSPEC_BUF_SIZE 1024 +#define CHAN_SEL_IOCTL_DELAY 300 +#define CHAN_SEL_RETRY_COUNT 15 +#define CHANNEL_IS_RADAR(channel) (((channel & WL_CHAN_RADAR) || \ + (channel & WL_CHAN_PASSIVE)) ? true : false) +#define CHANNEL_IS_2G(channel) (((channel >= 1) && (channel <= 14)) ? \ + true : false) +#define CHANNEL_IS_5G(channel) (((channel >= 36) && (channel <= 165)) ? \ + true : false) +extern s32 wl_cfg80211_get_best_channels(struct net_device *dev, char* command, + int total_len); +#endif /* WL_SUPPORT_AUTO_CHANNEL */ extern int wl_cfg80211_hang(struct net_device *dev, u16 reason); extern s32 wl_mode_to_nl80211_iftype(s32 mode); int wl_cfg80211_do_driver_init(struct net_device *net); void wl_cfg80211_enable_trace(bool set, u32 level); -extern s32 wl_update_wiphybands(struct wl_priv *wl); +extern s32 wl_update_wiphybands(struct wl_priv *wl, bool notify); extern s32 wl_cfg80211_if_is_group_owner(void); extern chanspec_t wl_ch_host_to_driver(u16 channel); extern s32 wl_add_remove_eventmsg(struct net_device *ndev, u16 event, bool add); -extern void wl_stop_wait_next_action_frame(struct wl_priv *wl, struct net_device *ndev); +extern void wl_stop_wait_next_action_frame(struct wl_priv *wl); +extern int wl_cfg80211_update_power_mode(struct net_device *dev); #ifdef WL_HOST_BAND_MGMT extern s32 wl_cfg80211_set_band(struct net_device *ndev, int band); #endif /* WL_HOST_BAND_MGMT */ +extern void wl_cfg80211_add_to_eventbuffer(wl_eventmsg_buf_t *ev, u16 event, bool set); +extern s32 wl_cfg80211_apply_eventbuffer(struct net_device *ndev, + struct wl_priv *wl, wl_eventmsg_buf_t *ev); +extern void get_primary_mac(struct wl_priv *wl, struct ether_addr *mac); +#define SCAN_BUF_CNT 2 +#define SCAN_BUF_NEXT 1 +#if defined(DUAL_ESCAN_RESULT_BUFFER) +#define wl_escan_set_sync_id(a, b) ((a) = (b)->escan_info.cur_sync_id) +#define wl_escan_get_buf(a, b) ((wl_scan_results_t *) (a)->escan_info.escan_buf\ +[((a)->escan_info.cur_sync_id + (b))%SCAN_BUF_CNT]) +static inline int wl_escan_check_sync_id(s32 status, u16 result_id, u16 wl_id) +{ + if (result_id != wl_id) { + WL_ERR(("ESCAN sync id mismatch :status :%d " + "cur_sync_id:%d coming sync_id:%d\n", + status, wl_id, result_id)); + return -1; + } + else + return 0; +} +static inline void wl_escan_print_sync_id(s32 status, u16 result_id, u16 wl_id) +{ + if (result_id != wl_id) { + WL_ERR(("ESCAN sync id mismatch :status :%d " + "cur_sync_id:%d coming sync_id:%d\n", + status, wl_id, result_id)); + } +} +#define wl_escan_increment_sync_id(a, b) ((a)->escan_info.cur_sync_id += b) +#define wl_escan_init_sync_id(a) ((a)->escan_info.cur_sync_id = 0) +#else +#define wl_escan_set_sync_id(a, b) ((a) = htod16(0x1234)) +#define wl_escan_get_buf(a, b) ((wl_scan_results_t *) (a)->escan_info.escan_buf) +#define wl_escan_check_sync_id(a, b, c) 0 +#define wl_escan_print_sync_id(a, b, c) +#define wl_escan_increment_sync_id(a, b) +#define wl_escan_init_sync_id(a) +#endif /* DUAL_ESCAN_RESULT_BUFFER */ extern void wl_cfg80211_ibss_vsie_set_buffer(vndr_ie_setbuf_t *ibss_vsie, int ibss_vsie_len); extern s32 wl_cfg80211_ibss_vsie_delete(struct net_device *dev); /* Action frame specific functions */ extern u8 wl_get_action_category(void *frame, u32 frame_len); extern int wl_get_public_action(void *frame, u32 frame_len, u8 *ret_action); +#ifdef WLAIBSS +extern void wl_cfg80211_set_txfail_pid(int pid); +#endif /* WLAIBSS */ +#ifdef WLFBT +extern void wl_get_fbt_key(uint8 *key); +#endif #endif /* _wl_cfg80211_h_ */ diff --git a/drivers/net/wireless/bcmdhd/wl_cfgp2p.c b/drivers/net/wireless/bcmdhd/wl_cfgp2p.c index 437e3e8f0cf..cd7a3428e19 100644 --- a/drivers/net/wireless/bcmdhd/wl_cfgp2p.c +++ b/drivers/net/wireless/bcmdhd/wl_cfgp2p.c @@ -1,7 +1,7 @@ /* * Linux cfgp2p driver * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -21,7 +21,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: wl_cfgp2p.c 424074 2013-09-16 06:01:12Z $ + * $Id: wl_cfgp2p.c 445404 2013-12-26 13:52:07Z $ * */ #include @@ -41,6 +41,7 @@ #include #include #include +#include #include #include @@ -55,20 +56,39 @@ wl_cfgp2p_has_ie(u8 *ie, u8 **tlvs, u32 *tlvs_len, const u8 *oui, u32 oui_len, u static u32 wl_cfgp2p_vndr_ie(struct wl_priv *wl, u8 *iebuf, s32 pktflag, s8 *oui, s32 ie_id, s8 *data, s32 datalen, const s8* add_del_cmd); +static s32 wl_cfgp2p_cancel_listen(struct wl_priv *wl, struct net_device *ndev, + struct wireless_dev *wdev, bool notify); +#if defined(WL_ENABLE_P2P_IF) static int wl_cfgp2p_start_xmit(struct sk_buff *skb, struct net_device *ndev); static int wl_cfgp2p_do_ioctl(struct net_device *net, struct ifreq *ifr, int cmd); static int wl_cfgp2p_if_open(struct net_device *net); static int wl_cfgp2p_if_stop(struct net_device *net); -static s32 wl_cfgp2p_cancel_listen(struct wl_priv *wl, struct net_device *ndev, - bool notify); static const struct net_device_ops wl_cfgp2p_if_ops = { - .ndo_open = wl_cfgp2p_if_open, - .ndo_stop = wl_cfgp2p_if_stop, - .ndo_do_ioctl = wl_cfgp2p_do_ioctl, - .ndo_start_xmit = wl_cfgp2p_start_xmit, + .ndo_open = wl_cfgp2p_if_open, + .ndo_stop = wl_cfgp2p_if_stop, + .ndo_do_ioctl = wl_cfgp2p_do_ioctl, + .ndo_start_xmit = wl_cfgp2p_start_xmit, }; +#endif /* WL_ENABLE_P2P_IF */ + +#if defined(WL_NEWCFG_PRIVCMD_SUPPORT) +static int wl_cfgp2p_start_xmit(struct sk_buff *skb, struct net_device *ndev); +static int wl_cfgp2p_do_ioctl(struct net_device *net, struct ifreq *ifr, int cmd); + +static int wl_cfgp2p_if_dummy(struct net_device *net) +{ + return 0; +} + +static const struct net_device_ops wl_cfgp2p_if_ops = { + .ndo_open = wl_cfgp2p_if_dummy, + .ndo_stop = wl_cfgp2p_if_dummy, + .ndo_do_ioctl = wl_cfgp2p_do_ioctl, + .ndo_start_xmit = wl_cfgp2p_start_xmit, +}; +#endif /* WL_NEWCFG_PRIVCMD_SUPPORT */ bool wl_cfgp2p_is_pub_action(void *frame, u32 frame_len) { @@ -109,7 +129,6 @@ bool wl_cfgp2p_is_p2p_action(void *frame, u32 frame_len) return false; } -#ifdef WL11U #define GAS_RESP_LEN 2 #define DOUBLE_TLV_BODY_OFF 4 #define GAS_RESP_OFFSET 4 @@ -141,7 +160,6 @@ bool wl_cfgp2p_find_gas_subtype(u8 subtype, u8* data, u32 len) return false; } -#endif /* WL11U */ bool wl_cfgp2p_is_gas_action(void *frame, u32 frame_len) { @@ -152,7 +170,7 @@ bool wl_cfgp2p_is_gas_action(void *frame, u32 frame_len) return false; sd_act_frm = (wifi_p2psd_gas_pub_act_frame_t *)frame; - if (frame_len < sizeof(wifi_p2psd_gas_pub_act_frame_t) - 1) + if (frame_len < (sizeof(wifi_p2psd_gas_pub_act_frame_t) - 1)) return false; if (sd_act_frm->category != P2PSD_ACTION_CATEGORY) return false; @@ -182,6 +200,29 @@ bool wl_cfgp2p_is_gas_action(void *frame, u32 frame_len) return false; #endif /* WL11U */ } +#ifdef CUSTOMER_HW4 +bool wl_cfgp2p_is_p2p_gas_action(void *frame, u32 frame_len) +{ + + wifi_p2psd_gas_pub_act_frame_t *sd_act_frm; + + if (frame == NULL) + return false; + + sd_act_frm = (wifi_p2psd_gas_pub_act_frame_t *)frame; + if (frame_len < (sizeof(wifi_p2psd_gas_pub_act_frame_t) - 1)) + return false; + if (sd_act_frm->category != P2PSD_ACTION_CATEGORY) + return false; + + if (sd_act_frm->action == P2PSD_ACTION_ID_GAS_IREQ) + return wl_cfgp2p_find_gas_subtype(P2PSD_GAS_OUI_SUBTYPE, + (u8 *)sd_act_frm->query_data, + frame_len); + else + return false; +} +#endif /* CUSTOMER_HW4 */ void wl_cfgp2p_print_actframe(bool tx, void *frame, u32 frame_len, u32 channel) { wifi_p2p_pub_act_frame_t *pact_frm; @@ -427,7 +468,7 @@ wl_cfgp2p_ifadd(struct wl_priv *wl, struct ether_addr *mac, u8 if_type, /* Disable a P2P BSS. * Parameters: - * @mac : MAC address of the BSS to create + * @mac : MAC address of the BSS to disable * Returns 0 if success. */ s32 @@ -448,7 +489,7 @@ wl_cfgp2p_ifdisable(struct wl_priv *wl, struct ether_addr *mac) /* Delete a P2P BSS. * Parameters: - * @mac : MAC address of the BSS to create + * @mac : MAC address of the BSS to delete * Returns 0 if success. */ s32 @@ -890,6 +931,7 @@ wl_cfgp2p_escan(struct wl_priv *wl, struct net_device *dev, u16 active, eparams->params.nprobes = htod32((eparams->params.active_time / P2PAPI_SCAN_NPROBS_TIME_MS)); + if (eparams->params.nprobes <= 0) eparams->params.nprobes = 1; CFGP2P_DBG(("nprobes # %d, active_time %d\n", @@ -903,11 +945,7 @@ wl_cfgp2p_escan(struct wl_priv *wl, struct net_device *dev, u16 active, } eparams->version = htod32(ESCAN_REQ_VERSION); eparams->action = htod16(action); -#if defined(CUSTOMER_HW4) && defined(DUAL_ESCAN_RESULT_BUFFER) - eparams->sync_id = wl->escan_info.cur_sync_id; -#else - eparams->sync_id = htod16(0x1234); -#endif /* CUSTOMER_HW4 && DUAL_ESCAN_RESULT_BUFFER */ + wl_escan_set_sync_id(eparams->sync_id, wl); CFGP2P_INFO(("SCAN CHANNELS : ")); for (i = 0; i < num_chans; i++) { @@ -941,13 +979,23 @@ wl_cfgp2p_act_frm_search(struct wl_priv *wl, struct net_device *ndev, p2p_scan_purpose_t p2p_scan_purpose = P2P_SCAN_AFX_PEER_NORMAL; if (!p2p_is_on(wl) || ndev == NULL || bssidx == WL_INVALID) return -BCME_ERROR; - CFGP2P_ERR((" Enter\n")); + CFGP2P_DBG((" Enter\n")); if (bssidx == wl_to_p2p_bss_bssidx(wl, P2PAPI_BSSCFG_PRIMARY)) bssidx = wl_to_p2p_bss_bssidx(wl, P2PAPI_BSSCFG_DEVICE); if (channel) chan_cnt = AF_PEER_SEARCH_CNT; else chan_cnt = SOCIAL_CHAN_CNT; +#ifdef CUSTOMER_HW4 + if (wl->afx_hdl->pending_tx_act_frm && wl->afx_hdl->is_active) { + wl_action_frame_t *action_frame; + action_frame = &(wl->afx_hdl->pending_tx_act_frm->action_frame); + if (wl_cfgp2p_is_p2p_gas_action(action_frame->data, action_frame->len)) { + chan_cnt = 1; + p2p_scan_purpose = P2P_SCAN_AFX_PEER_REDUCED; + } + } +#endif /* CUSTOMER_HW4 */ default_chan_list = kzalloc(chan_cnt * sizeof(*default_chan_list), GFP_KERNEL); if (default_chan_list == NULL) { CFGP2P_ERR(("channel list allocation failed \n")); @@ -965,6 +1013,7 @@ wl_cfgp2p_act_frm_search(struct wl_priv *wl, struct net_device *ndev, default_chan_list[1] = SOCIAL_CHAN_2; default_chan_list[2] = SOCIAL_CHAN_3; } + ret = wl_cfgp2p_escan(wl, ndev, true, chan_cnt, default_chan_list, WL_P2P_DISC_ST_SEARCH, WL_SCAN_ACTION_START, bssidx, NULL, p2p_scan_purpose); @@ -1534,19 +1583,19 @@ wl_cfgp2p_find_type(struct wl_priv *wl, s32 bssidx, s32 *type) * Callback function for WLC_E_P2P_DISC_LISTEN_COMPLETE */ s32 -wl_cfgp2p_listen_complete(struct wl_priv *wl, struct net_device *ndev, - const wl_event_msg_t *e, void *data) +wl_cfgp2p_listen_complete(struct wl_priv *wl, bcm_struct_cfgdev *cfgdev, + const wl_event_msg_t *e, void *data) { s32 ret = BCME_OK; - struct net_device *netdev; + struct net_device *ndev = NULL; + if (!wl || !wl->p2p) return BCME_ERROR; - if (wl->p2p_net == ndev) { - netdev = wl_to_prmry_ndev(wl); - } else { - netdev = ndev; - } + CFGP2P_DBG((" Enter\n")); + + ndev = cfgdev_to_wlc_ndev(cfgdev, wl); + if (wl_get_p2p_status(wl, LISTEN_EXPIRED) == 0) { wl_set_p2p_status(wl, LISTEN_EXPIRED); if (timer_pending(&wl->p2p->listen_timer)) { @@ -1560,12 +1609,12 @@ wl_cfgp2p_listen_complete(struct wl_priv *wl, struct net_device *ndev, } #ifdef WL_CFG80211_SYNC_GON else if (wl_get_drv_status_all(wl, WAITING_NEXT_ACT_FRM_LISTEN)) { - wl_clr_drv_status(wl, WAITING_NEXT_ACT_FRM_LISTEN, netdev); + wl_clr_drv_status(wl, WAITING_NEXT_ACT_FRM_LISTEN, ndev); WL_DBG(("Listen DONE and wake up wait_next_af !!(%d)\n", jiffies_to_msecs(jiffies - wl->af_tx_sent_jiffies))); if (wl_get_drv_status_all(wl, WAITING_NEXT_ACT_FRM)) - wl_clr_drv_status(wl, WAITING_NEXT_ACT_FRM, netdev); + wl_clr_drv_status(wl, WAITING_NEXT_ACT_FRM, ndev); complete(&wl->wait_next_af); } @@ -1578,13 +1627,18 @@ wl_cfgp2p_listen_complete(struct wl_priv *wl, struct net_device *ndev, wl_get_drv_status_all(wl, FAKE_REMAINING_ON_CHANNEL)) { #endif /* WL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST */ WL_DBG(("Listen DONE for ramain on channel expired\n")); - wl_clr_drv_status(wl, REMAINING_ON_CHANNEL, netdev); + wl_clr_drv_status(wl, REMAINING_ON_CHANNEL, ndev); #ifdef WL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST - wl_clr_drv_status(wl, FAKE_REMAINING_ON_CHANNEL, netdev); + wl_clr_drv_status(wl, FAKE_REMAINING_ON_CHANNEL, ndev); #endif /* WL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST */ if (ndev && (ndev->ieee80211_ptr != NULL)) { - cfg80211_remain_on_channel_expired(ndev, wl->last_roc_id, +#if defined(WL_CFG80211_P2P_DEV_IF) + cfg80211_remain_on_channel_expired(cfgdev, wl->last_roc_id, + &wl->remain_on_chan, GFP_KERNEL); +#else + cfg80211_remain_on_channel_expired(cfgdev, wl->last_roc_id, &wl->remain_on_chan, wl->remain_on_chan_type, GFP_KERNEL); +#endif /* WL_CFG80211_P2P_DEV_IF */ } } if (wl_add_remove_eventmsg(wl_to_prmry_ndev(wl), @@ -1611,15 +1665,20 @@ wl_cfgp2p_listen_expired(unsigned long data) CFGP2P_DBG((" Enter\n")); bzero(&msg, sizeof(wl_event_msg_t)); msg.event_type = hton32(WLC_E_P2P_DISC_LISTEN_COMPLETE); +#if defined(WL_ENABLE_P2P_IF) wl_cfg80211_event(wl->p2p_net ? wl->p2p_net : wl_to_p2p_bss_ndev(wl, P2PAPI_BSSCFG_DEVICE), &msg, NULL); +#else + wl_cfg80211_event(wl_to_p2p_bss_ndev(wl, P2PAPI_BSSCFG_DEVICE), &msg, + NULL); +#endif /* WL_ENABLE_P2P_IF */ } /* * Routine for cancelling the P2P LISTEN */ static s32 wl_cfgp2p_cancel_listen(struct wl_priv *wl, struct net_device *ndev, - bool notify) + struct wireless_dev *wdev, bool notify) { WL_DBG(("Enter \n")); /* Irrespective of whether timer is running or not, reset @@ -1633,9 +1692,13 @@ wl_cfgp2p_cancel_listen(struct wl_priv *wl, struct net_device *ndev, del_timer_sync(&wl->p2p->listen_timer); if (notify) if (ndev && ndev->ieee80211_ptr) { +#if defined(WL_CFG80211_P2P_DEV_IF) + cfg80211_remain_on_channel_expired(wdev, wl->last_roc_id, + &wl->remain_on_chan, GFP_KERNEL); +#else cfg80211_remain_on_channel_expired(ndev, wl->last_roc_id, - &wl->remain_on_chan, wl->remain_on_chan_type, - GFP_KERNEL); + &wl->remain_on_chan, wl->remain_on_chan_type, GFP_KERNEL); +#endif /* WL_CFG80211_P2P_DEV_IF */ } } return 0; @@ -1739,7 +1802,7 @@ wl_cfgp2p_discover_enable_search(struct wl_priv *wl, u8 enable) * Callback function for WLC_E_ACTION_FRAME_COMPLETE, WLC_E_ACTION_FRAME_OFF_CHAN_COMPLETE */ s32 -wl_cfgp2p_action_tx_complete(struct wl_priv *wl, struct net_device *ndev, +wl_cfgp2p_action_tx_complete(struct wl_priv *wl, bcm_struct_cfgdev *cfgdev, const wl_event_msg_t *e, void *data) { s32 ret = BCME_OK; @@ -1751,15 +1814,14 @@ wl_cfgp2p_action_tx_complete(struct wl_priv *wl, struct net_device *ndev, CFGP2P_INFO((" WLC_E_ACTION_FRAME_COMPLETE is received : %d\n", status)); if (status == WLC_E_STATUS_SUCCESS) { - wl_set_p2p_status(wl, ACTION_TX_COMPLETED); + wl_set_p2p_status(wl, ACTION_TX_COMPLETED); CFGP2P_DBG(("WLC_E_ACTION_FRAME_COMPLETE : ACK\n")); - } else { if (!wl_get_p2p_status(wl, ACTION_TX_COMPLETED)) { - wl_set_p2p_status(wl, ACTION_TX_NOACK); - CFGP2P_INFO(("WLC_E_ACTION_FRAME_COMPLETE : NO ACK\n")); - wl_stop_wait_next_action_frame(wl, ndev); + wl_set_p2p_status(wl, ACTION_TX_NOACK); + CFGP2P_INFO(("WLC_E_ACTION_FRAME_COMPLETE : NO ACK\n")); + wl_stop_wait_next_action_frame(wl); } } } else { @@ -1785,7 +1847,9 @@ wl_cfgp2p_tx_action_frame(struct wl_priv *wl, struct net_device *dev, wl_af_params_t *af_params, s32 bssidx) { s32 ret = BCME_OK; + s32 evt_ret = BCME_OK; s32 timeout = 0; + wl_eventmsg_buf_t buf; CFGP2P_INFO(("\n")); @@ -1794,6 +1858,13 @@ wl_cfgp2p_tx_action_frame(struct wl_priv *wl, struct net_device *dev, wl_clr_p2p_status(wl, ACTION_TX_COMPLETED); wl_clr_p2p_status(wl, ACTION_TX_NOACK); + + bzero(&buf, sizeof(wl_eventmsg_buf_t)); + wl_cfg80211_add_to_eventbuffer(&buf, WLC_E_ACTION_FRAME_OFF_CHAN_COMPLETE, true); + wl_cfg80211_add_to_eventbuffer(&buf, WLC_E_ACTION_FRAME_COMPLETE, true); + if ((evt_ret = wl_cfg80211_apply_eventbuffer(wl_to_prmry_ndev(wl), wl, &buf)) < 0) + return evt_ret; + if (bssidx == P2PAPI_BSSCFG_PRIMARY) bssidx = wl_to_p2p_bss_bssidx(wl, P2PAPI_BSSCFG_DEVICE); @@ -1806,7 +1877,6 @@ wl_cfgp2p_tx_action_frame(struct wl_priv *wl, struct net_device *dev, wl->ioctl_buf, WLC_IOCTL_MAXLEN, bssidx, &wl->ioctl_buf_sync); if (ret < 0) { - CFGP2P_ERR((" sending action frame is failed\n")); goto exit; } @@ -1827,6 +1897,15 @@ wl_cfgp2p_tx_action_frame(struct wl_priv *wl, struct net_device *dev, exit: CFGP2P_INFO((" via act frame iovar : status = %d\n", ret)); + + bzero(&buf, sizeof(wl_eventmsg_buf_t)); + wl_cfg80211_add_to_eventbuffer(&buf, WLC_E_ACTION_FRAME_OFF_CHAN_COMPLETE, false); + wl_cfg80211_add_to_eventbuffer(&buf, WLC_E_ACTION_FRAME_COMPLETE, false); + if ((evt_ret = wl_cfg80211_apply_eventbuffer(wl_to_prmry_ndev(wl), wl, &buf)) < 0) { + WL_ERR(("TX frame events revert back failed \n")); + return evt_ret; + } + return ret; } @@ -1971,8 +2050,13 @@ wl_cfgp2p_supported(struct wl_priv *wl, struct net_device *ndev) ret = wldev_iovar_getint(ndev, "p2p", &p2p_supported); if (ret < 0) { - CFGP2P_ERR(("wl p2p error %d\n", ret)); - return 0; + if (ret == BCME_UNSUPPORTED) { + CFGP2P_INFO(("p2p is unsupported\n")); + return 0; + } else { + CFGP2P_ERR(("wl p2p error %d\n", ret)); + return ret; + } } if (p2p_supported == 1) { CFGP2P_INFO(("p2p is supported\n")); @@ -1986,9 +2070,19 @@ wl_cfgp2p_supported(struct wl_priv *wl, struct net_device *ndev) s32 wl_cfgp2p_down(struct wl_priv *wl) { + struct net_device *ndev = NULL; + struct wireless_dev *wdev = NULL; s32 i = 0, index = -1; - wl_cfgp2p_cancel_listen(wl, - wl->p2p_net ? wl->p2p_net : wl_to_prmry_ndev(wl), TRUE); + +#if defined(WL_CFG80211_P2P_DEV_IF) + ndev = wl_to_prmry_ndev(wl); + wdev = wl_to_p2p_wdev(wl); +#elif defined(WL_ENABLE_P2P_IF) + ndev = wl->p2p_net ? wl->p2p_net : wl_to_prmry_ndev(wl); + wdev = ndev_to_wdev(ndev); +#endif /* WL_CFG80211_P2P_DEV_IF */ + + wl_cfgp2p_cancel_listen(wl, ndev, wdev, TRUE); for (i = 0; i < P2PAPI_BSSCFG_MAX; i++) { index = wl_to_p2p_bss_bssidx(wl, i); if (index != WL_INVALID) @@ -2139,10 +2233,17 @@ wl_cfgp2p_set_p2p_ps(struct wl_priv *wl, struct net_device *ndev, char* buf, int } if ((legacy_ps != -1) && ((legacy_ps == PM_MAX) || (legacy_ps == PM_OFF))) { +#if defined(SUPPORT_PM2_ONLY) + if (legacy_ps == PM_MAX) + legacy_ps = PM_FAST; +#endif /* SUPPORT_PM2_ONLY */ + ret = wldev_ioctl(wl_to_p2p_bss_ndev(wl, P2PAPI_BSSCFG_CONNECTION), WLC_SET_PM, &legacy_ps, sizeof(legacy_ps), true); if (unlikely(ret)) { CFGP2P_ERR(("error (%d)\n", ret)); + } else { + wl_cfg80211_update_power_mode(ndev); } } else @@ -2287,12 +2388,15 @@ struct ethtool_ops cfgp2p_ethtool_ops = { }; #endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 24) */ +#if defined(WL_ENABLE_P2P_IF) || defined(WL_NEWCFG_PRIVCMD_SUPPORT) s32 wl_cfgp2p_register_ndev(struct wl_priv *wl) { int ret = 0; struct net_device* net = NULL; +#ifndef WL_NEWCFG_PRIVCMD_SUPPORT struct wireless_dev *wdev = NULL; +#endif /* WL_NEWCFG_PRIVCMD_SUPPORT */ uint8 temp_addr[ETHER_ADDR_LEN] = { 0x00, 0x90, 0x4c, 0x33, 0x22, 0x11 }; if (wl->p2p_net) { @@ -2306,12 +2410,14 @@ wl_cfgp2p_register_ndev(struct wl_priv *wl) return -ENODEV; } +#ifndef WL_NEWCFG_PRIVCMD_SUPPORT wdev = kzalloc(sizeof(*wdev), GFP_KERNEL); if (unlikely(!wdev)) { WL_ERR(("Could not allocate wireless device\n")); free_netdev(net); return -ENOMEM; } +#endif /* WL_NEWCFG_PRIVCMD_SUPPORT */ strncpy(net->name, "p2p%d", sizeof(net->name) - 1); net->name[IFNAMSIZ - 1] = '\0'; @@ -2333,33 +2439,41 @@ wl_cfgp2p_register_ndev(struct wl_priv *wl) /* Register with a dummy MAC addr */ memcpy(net->dev_addr, temp_addr, ETHER_ADDR_LEN); +#ifndef WL_NEWCFG_PRIVCMD_SUPPORT wdev->wiphy = wl->wdev->wiphy; wdev->iftype = wl_mode_to_nl80211_iftype(WL_MODE_BSS); net->ieee80211_ptr = wdev; +#endif /* WL_NEWCFG_PRIVCMD_SUPPORT */ #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 24) net->ethtool_ops = &cfgp2p_ethtool_ops; #endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 24) */ +#ifndef WL_NEWCFG_PRIVCMD_SUPPORT SET_NETDEV_DEV(net, wiphy_dev(wdev->wiphy)); /* Associate p2p0 network interface with new wdev */ wdev->netdev = net; +#endif /* WL_NEWCFG_PRIVCMD_SUPPORT */ ret = register_netdev(net); if (ret) { CFGP2P_ERR((" register_netdevice failed (%d)\n", ret)); free_netdev(net); +#ifndef WL_NEWCFG_PRIVCMD_SUPPORT kfree(wdev); +#endif /* WL_NEWCFG_PRIVCMD_SUPPORT */ return -ENODEV; } /* store p2p net ptr for further reference. Note that iflist won't have this * entry as there corresponding firmware interface is a "Hidden" interface. */ +#ifndef WL_NEWCFG_PRIVCMD_SUPPORT wl->p2p_wdev = wdev; +#endif /* WL_NEWCFG_PRIVCMD_SUPPORT */ wl->p2p_net = net; printk("%s: P2P Interface Registered\n", net->name); @@ -2383,12 +2497,14 @@ wl_cfgp2p_unregister_ndev(struct wl_priv *wl) } static int wl_cfgp2p_start_xmit(struct sk_buff *skb, struct net_device *ndev) { + if (skb) { CFGP2P_DBG(("(%s) is not used for data operations.Droping the packet.\n", ndev->name)); dev_kfree_skb_any(skb); } + return 0; } @@ -2413,7 +2529,9 @@ static int wl_cfgp2p_do_ioctl(struct net_device *net, struct ifreq *ifr, int cmd return ret; } +#endif /* WL_ENABLE_P2P_IF || WL_NEWCFG_PRIVCMD_SUPPORT */ +#if defined(WL_ENABLE_P2P_IF) static int wl_cfgp2p_if_open(struct net_device *net) { extern struct wl_priv *wlcfg_drv_priv; @@ -2423,6 +2541,7 @@ static int wl_cfgp2p_if_open(struct net_device *net) if (!wdev || !wl || !wl->p2p) return -EINVAL; WL_TRACE(("Enter\n")); +#if !defined(WL_IFACE_COMB_NUM_CHANNELS) /* If suppose F/W download (ifconfig wlan0 up) hasn't been done by now, * do it here. This will make sure that in concurrent mode, supplicant * is not dependent on a particular order of interface initialization. @@ -2431,6 +2550,7 @@ static int wl_cfgp2p_if_open(struct net_device *net) */ wdev->wiphy->interface_modes |= (BIT(NL80211_IFTYPE_P2P_CLIENT) | BIT(NL80211_IFTYPE_P2P_GO)); +#endif /* !WL_IFACE_COMB_NUM_CHANNELS */ wl_cfg80211_do_driver_init(net); return 0; @@ -2459,9 +2579,11 @@ static int wl_cfgp2p_if_stop(struct net_device *net) spin_unlock_irqrestore(&wl->cfgdrv_lock, flags); if (clear_flag) wl_clr_drv_status(wl, SCANNING, net); +#if !defined(WL_IFACE_COMB_NUM_CHANNELS) wdev->wiphy->interface_modes = (wdev->wiphy->interface_modes) & (~(BIT(NL80211_IFTYPE_P2P_CLIENT)| BIT(NL80211_IFTYPE_P2P_GO))); +#endif /* !WL_IFACE_COMB_NUM_CHANNELS */ return 0; } @@ -2469,3 +2591,149 @@ bool wl_cfgp2p_is_ifops(const struct net_device_ops *if_ops) { return (if_ops == &wl_cfgp2p_if_ops); } +#endif /* WL_ENABLE_P2P_IF */ + +#if defined(WL_CFG80211_P2P_DEV_IF) +struct wireless_dev * +wl_cfgp2p_add_p2p_disc_if(void) +{ + extern struct wl_priv *wlcfg_drv_priv; + struct wl_priv *wl = wlcfg_drv_priv; + struct wireless_dev *wdev = NULL; + struct ether_addr primary_mac; + + if (!wl) + return NULL; + + WL_TRACE(("Enter\n")); + + if (wl->p2p_wdev) { + CFGP2P_ERR(("p2p_wdev defined already.\n")); + return NULL; + } + + wdev = kzalloc(sizeof(*wdev), GFP_KERNEL); + if (unlikely(!wdev)) { + WL_ERR(("Could not allocate wireless device\n")); + return NULL; + } + + memset(&primary_mac, 0, sizeof(primary_mac)); + get_primary_mac(wl, &primary_mac); + wl_cfgp2p_generate_bss_mac(&primary_mac, + &wl->p2p->dev_addr, &wl->p2p->int_addr); + + wdev->wiphy = wl->wdev->wiphy; + wdev->iftype = NL80211_IFTYPE_P2P_DEVICE; + memcpy(wdev->address, &wl->p2p->dev_addr, ETHER_ADDR_LEN); + + /* store p2p wdev ptr for further reference. */ + wl->p2p_wdev = wdev; + + CFGP2P_ERR(("P2P interface registered\n")); + + return wdev; +} + +int +wl_cfgp2p_start_p2p_device(struct wiphy *wiphy, struct wireless_dev *wdev) +{ + int ret = 0; + extern struct wl_priv *wlcfg_drv_priv; + struct wl_priv *wl = wlcfg_drv_priv; + + if (!wl) + return -EINVAL; + + WL_TRACE(("Enter\n")); + + ret = wl_cfgp2p_set_firm_p2p(wl); + if (unlikely(ret < 0)) { + CFGP2P_ERR(("Set P2P in firmware failed, ret=%d\n", ret)); + goto exit; + } + + ret = wl_cfgp2p_enable_discovery(wl, wl_to_prmry_ndev(wl), NULL, 0); + if (unlikely(ret < 0)) { + CFGP2P_ERR(("P2P enable discovery failed, ret=%d\n", ret)); + goto exit; + } + + p2p_on(wl) = true; + + CFGP2P_DBG(("P2P interface started\n")); + +exit: + return ret; +} + +void +wl_cfgp2p_stop_p2p_device(struct wiphy *wiphy, struct wireless_dev *wdev) +{ + int ret = 0; + int clear_flag = 0; + unsigned long flags = 0; + struct net_device *ndev = NULL; + extern struct wl_priv *wlcfg_drv_priv; + struct wl_priv *wl = wlcfg_drv_priv; + + if (!wl || !wdev) + return; + + WL_TRACE(("Enter\n")); + + ndev = wdev_to_wlc_ndev(wdev, wl); + + spin_lock_irqsave(&wl->cfgdrv_lock, flags); + if (wl->scan_request && wl->scan_request->wdev == wdev) { + cfg80211_scan_done(wl->scan_request, true); + wl->scan_request = NULL; + clear_flag = 1; + } + spin_unlock_irqrestore(&wl->cfgdrv_lock, flags); + + if (clear_flag) + wl_clr_drv_status(wl, SCANNING, ndev); + + if (!wl->p2p_supported) + return; + + ret = wl_cfgp2p_disable_discovery(wl); + if (unlikely(ret < 0)) { + CFGP2P_ERR(("P2P disable discovery failed, ret=%d\n", ret)); + goto exit; + } + + p2p_on(wl) = false; + + CFGP2P_DBG(("P2P interface stopped\n")); + +exit: + return; +} + +int +wl_cfgp2p_del_p2p_disc_if(struct wireless_dev *wdev) +{ + extern struct wl_priv *wlcfg_drv_priv; + struct wl_priv *wl = wlcfg_drv_priv; + + if (!wdev) + return -EINVAL; + + WL_TRACE(("Enter\n")); + + rtnl_lock(); + /* cfg80211_unregister_wdev() requires RTNL to be held */ + cfg80211_unregister_wdev(wdev); + rtnl_unlock(); + + kfree(wdev); + + wl->p2p_wdev = NULL; + + CFGP2P_ERR(("P2P interface unregistered\n")); + + return 0; +} +#endif /* WL_CFG80211_P2P_DEV_IF */ diff --git a/drivers/net/wireless/bcmdhd/wl_cfgp2p.h b/drivers/net/wireless/bcmdhd/wl_cfgp2p.h index b3f6fa6ae45..329699b85d9 100644 --- a/drivers/net/wireless/bcmdhd/wl_cfgp2p.h +++ b/drivers/net/wireless/bcmdhd/wl_cfgp2p.h @@ -1,7 +1,7 @@ /* * Linux cfgp2p driver * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -21,7 +21,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: wl_cfgp2p.h 415464 2013-07-30 09:14:39Z $ + * $Id: wl_cfgp2p.h 445404 2013-12-26 13:52:07Z $ */ #ifndef _wl_cfgp2p_h_ #define _wl_cfgp2p_h_ @@ -191,6 +191,41 @@ enum wl_cfgp2p_status { timer->data = (unsigned long) wl; \ add_timer(timer); \ } while (0); + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)) +#define WL_CFG80211_P2P_DEV_IF + +#ifdef WL_ENABLE_P2P_IF +#undef WL_ENABLE_P2P_IF +#endif + +#ifdef WL_SUPPORT_BACKPORTED_KPATCHES +#undef WL_SUPPORT_BACKPORTED_KPATCHES +#endif +#endif /* (LINUX_VERSION >= VERSION(3, 8, 0)) */ + +#ifndef WL_CFG80211_P2P_DEV_IF +#ifdef WL_NEWCFG_PRIVCMD_SUPPORT +#undef WL_NEWCFG_PRIVCMD_SUPPORT +#endif +#endif /* WL_CFG80211_P2P_DEV_IF */ + +#if defined(WL_ENABLE_P2P_IF) && (defined(WL_CFG80211_P2P_DEV_IF) || \ + (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0))) +#error Disable 'WL_ENABLE_P2P_IF', if 'WL_CFG80211_P2P_DEV_IF' is enabled \ + or kernel version is 3.8.0 or above +#endif /* WL_ENABLE_P2P_IF && (WL_CFG80211_P2P_DEV_IF || (LINUX_VERSION >= VERSION(3, 8, 0))) */ + +#if !defined(WLP2P) && (defined(WL_ENABLE_P2P_IF) || defined(WL_CFG80211_P2P_DEV_IF)) +#error WLP2P not defined +#endif /* !WLP2P && (WL_ENABLE_P2P_IF || WL_CFG80211_P2P_DEV_IF) */ + +#if defined(WL_CFG80211_P2P_DEV_IF) +#define bcm_struct_cfgdev struct wireless_dev +#else +#define bcm_struct_cfgdev struct net_device +#endif /* WL_CFG80211_P2P_DEV_IF */ + extern void wl_cfgp2p_listen_expired(unsigned long data); extern bool @@ -199,6 +234,12 @@ extern bool wl_cfgp2p_is_p2p_action(void *frame, u32 frame_len); extern bool wl_cfgp2p_is_gas_action(void *frame, u32 frame_len); +extern bool +wl_cfgp2p_find_gas_subtype(u8 subtype, u8* data, u32 len); +#ifdef CUSTOMER_HW4 +extern bool +wl_cfgp2p_is_p2p_gas_action(void *frame, u32 frame_len); +#endif /* CUSTOMER_HW4 */ extern void wl_cfgp2p_print_actframe(bool tx, void *frame, u32 frame_len, u32 channel); extern s32 @@ -265,8 +306,8 @@ wl_cfgp2p_find_type(struct wl_priv *wl, s32 bssidx, s32 *type); extern s32 -wl_cfgp2p_listen_complete(struct wl_priv *wl, struct net_device *ndev, - const wl_event_msg_t *e, void *data); +wl_cfgp2p_listen_complete(struct wl_priv *wl, bcm_struct_cfgdev *cfgdev, + const wl_event_msg_t *e, void *data); extern s32 wl_cfgp2p_discover_listen(struct wl_priv *wl, s32 channel, u32 duration_ms); @@ -274,8 +315,9 @@ extern s32 wl_cfgp2p_discover_enable_search(struct wl_priv *wl, u8 enable); extern s32 -wl_cfgp2p_action_tx_complete(struct wl_priv *wl, struct net_device *ndev, - const wl_event_msg_t *e, void *data); +wl_cfgp2p_action_tx_complete(struct wl_priv *wl, bcm_struct_cfgdev *cfgdev, + const wl_event_msg_t *e, void *data); + extern s32 wl_cfgp2p_tx_action_frame(struct wl_priv *wl, struct net_device *dev, wl_af_params_t *af_params, s32 bssidx); @@ -311,6 +353,9 @@ wl_cfgp2p_set_p2p_ps(struct wl_priv *wl, struct net_device *ndev, char* buf, int extern u8 * wl_cfgp2p_retreive_p2pattrib(void *buf, u8 element_id); +extern u8* +wl_cfgp2p_find_attrib_in_all_p2p_Ies(u8 *parse, u32 len, u32 attrib); + extern u8 * wl_cfgp2p_retreive_p2p_dev_addr(wl_bss_info_t *bi, u32 bi_length); @@ -323,6 +368,20 @@ wl_cfgp2p_unregister_ndev(struct wl_priv *wl); extern bool wl_cfgp2p_is_ifops(const struct net_device_ops *if_ops); +#if defined(WL_CFG80211_P2P_DEV_IF) +extern struct wireless_dev * +wl_cfgp2p_add_p2p_disc_if(void); + +extern int +wl_cfgp2p_start_p2p_device(struct wiphy *wiphy, struct wireless_dev *wdev); + +extern void +wl_cfgp2p_stop_p2p_device(struct wiphy *wiphy, struct wireless_dev *wdev); + +extern int +wl_cfgp2p_del_p2p_disc_if(struct wireless_dev *wdev); +#endif /* WL_CFG80211_P2P_DEV_IF */ + /* WiFi Direct */ #define SOCIAL_CHAN_1 1 #define SOCIAL_CHAN_2 6 @@ -338,20 +397,16 @@ wl_cfgp2p_is_ifops(const struct net_device_ops *if_ops); #define WL_P2P_TEMP_CHAN 11 /* If the provision discovery is for JOIN operations, + * or the device discoverablity frame is destined to GO * then we need not do an internal scan to find GO. -*/ -#define IS_PROV_DISC_WITHOUT_GROUP_ID(p2p_ie, len) \ + */ +#define IS_ACTPUB_WITHOUT_GROUP_ID(p2p_ie, len) \ (wl_cfgp2p_retreive_p2pattrib(p2p_ie, P2P_SEID_GROUP_ID) == NULL) #define IS_GAS_REQ(frame, len) (wl_cfgp2p_is_gas_action(frame, len) && \ ((frame->action == P2PSD_ACTION_ID_GAS_IREQ) || \ (frame->action == P2PSD_ACTION_ID_GAS_CREQ))) -#define IS_P2P_PUB_ACT_REQ(frame, p2p_ie, len) \ - (wl_cfgp2p_is_pub_action(frame, len) && \ - ((frame->subtype == P2P_PAF_GON_REQ) || \ - (frame->subtype == P2P_PAF_INVITE_REQ) || \ - ((frame->subtype == P2P_PAF_PROVDIS_REQ) && \ - IS_PROV_DISC_WITHOUT_GROUP_ID(p2p_ie, len)))) + #define IS_P2P_PUB_ACT_RSP_SUBTYPE(subtype) ((subtype == P2P_PAF_GON_RSP) || \ ((subtype == P2P_PAF_GON_CONF) || \ (subtype == P2P_PAF_INVITE_RSP) || \ diff --git a/drivers/net/wireless/bcmdhd/wl_dbg.h b/drivers/net/wireless/bcmdhd/wl_dbg.h index f9e93624b5b..c07ae30ee76 100644 --- a/drivers/net/wireless/bcmdhd/wl_dbg.h +++ b/drivers/net/wireless/bcmdhd/wl_dbg.h @@ -2,7 +2,7 @@ * Minimal debug/trace/assert driver definitions for * Broadcom 802.11 Networking Adapter. * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -22,7 +22,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: wl_dbg.h 357993 2012-09-20 21:58:56Z $ + * $Id: wl_dbg.h 376019 2012-12-21 01:00:06Z $ */ diff --git a/drivers/net/wireless/bcmdhd/wl_iw.c b/drivers/net/wireless/bcmdhd/wl_iw.c index 6c063434dfb..af0764f7de6 100644 --- a/drivers/net/wireless/bcmdhd/wl_iw.c +++ b/drivers/net/wireless/bcmdhd/wl_iw.c @@ -1,7 +1,7 @@ /* * Linux Wireless Extensions support * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -21,7 +21,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: wl_iw.c 384655 2013-02-12 19:59:43Z $ + * $Id: wl_iw.c 396420 2013-04-12 06:55:45Z $ */ #if defined(USE_IW) @@ -38,7 +38,6 @@ #include #include - typedef const struct si_pub si_t; #include @@ -82,6 +81,11 @@ typedef const struct si_pub si_t; #define IW_AUTH_KEY_MGMT_FT_PSK 0x08 #endif +#ifndef IW_ENC_CAPA_FW_ROAM_ENABLE +#define IW_ENC_CAPA_FW_ROAM_ENABLE 0x00000020 +#endif + + #ifndef IW_ENCODE_ALG_PMK #define IW_ENCODE_ALG_PMK 4 @@ -123,7 +127,10 @@ extern int dhd_wait_pend8021x(struct net_device *dev); #endif -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0)) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)) +#define DAEMONIZE(a) +#elif ((LINUX_VERSION_CODE < KERNEL_VERSION(3, 8, 0)) && \ + (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0))) #define DAEMONIZE(a) daemonize(a); \ allow_signal(SIGKILL); \ allow_signal(SIGTERM); @@ -437,6 +444,9 @@ wl_iw_set_pm( error = dev_wlc_ioctl(dev, WLC_SET_PM, &pm, sizeof(pm)); return error; } + +#if WIRELESS_EXT > 17 +#endif #endif int @@ -772,6 +782,7 @@ wl_iw_get_range( nrate_list2copy = 3; } range->num_bitrates += 8; + ASSERT(range->num_bitrates < IW_MAX_BITRATES); for (k = 0; i < range->num_bitrates; k++, i++) { range->bitrate[i] = (nrate_list[nrate_list2copy][k]) * 500000; @@ -843,11 +854,16 @@ wl_iw_get_range( if (dev_wlc_intvar_get(dev, "fbt_cap", &fbt_cap) == 0) { if (fbt_cap == WLC_FBT_CAP_DRV_4WAY_AND_REASSOC) { - + range->enc_capa |= IW_ENC_CAPA_4WAY_HANDSHAKE; } } +#ifdef BCMFW_ROAM_ENABLE_WEXT + + range->enc_capa |= IW_ENC_CAPA_FW_ROAM_ENABLE; +#endif + IW_EVENT_CAPA_SET_KERNEL(range->event_capa); @@ -2692,7 +2708,7 @@ wl_iw_set_wpaauth( if ((error = dev_wlc_intvar_set(dev, "wsec", val))) return error; - + if (dev_wlc_intvar_get(dev, "fbt_cap", &fbt_cap) == 0) { if (fbt_cap == WLC_FBT_CAP_DRV_4WAY_AND_REASSOC) { if ((paramid == IW_AUTH_CIPHER_PAIRWISE) && (val & AES_ENABLED)) { @@ -3018,13 +3034,19 @@ static const iw_handler wl_iw_handler[] = enum { WL_IW_SET_LEDDC = SIOCIWFIRSTPRIV, WL_IW_SET_VLANMODE, - WL_IW_SET_PM + WL_IW_SET_PM, +#if WIRELESS_EXT > 17 +#endif + WL_IW_SET_LAST }; static iw_handler wl_iw_priv_handler[] = { wl_iw_set_leddc, wl_iw_set_vlanmode, - wl_iw_set_pm + wl_iw_set_pm, +#if WIRELESS_EXT > 17 +#endif + NULL }; static struct iw_priv_args wl_iw_priv_args[] = { @@ -3045,7 +3067,10 @@ static struct iw_priv_args wl_iw_priv_args[] = { IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "set_pm" - } + }, +#if WIRELESS_EXT > 17 +#endif + { 0, 0, 0, { 0 } } }; const struct iw_handler_def wl_iw_handler_def = @@ -3647,7 +3672,7 @@ static void wl_iw_send_scan_complete(iscan_info_t *iscan) memset(&wrqu, 0, sizeof(wrqu)); - + wireless_send_event(iscan->dev, SIOCGIWSCAN, &wrqu, NULL); } diff --git a/drivers/net/wireless/bcmdhd/wl_iw.h b/drivers/net/wireless/bcmdhd/wl_iw.h index 2afb5a683bb..a35e2cd1b74 100644 --- a/drivers/net/wireless/bcmdhd/wl_iw.h +++ b/drivers/net/wireless/bcmdhd/wl_iw.h @@ -1,7 +1,7 @@ /* * Linux Wireless Extensions support * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd/wl_linux_mon.c b/drivers/net/wireless/bcmdhd/wl_linux_mon.c index af2586326c2..117b0abe76d 100644 --- a/drivers/net/wireless/bcmdhd/wl_linux_mon.c +++ b/drivers/net/wireless/bcmdhd/wl_linux_mon.c @@ -1,7 +1,7 @@ /* * Broadcom Dongle Host Driver (DHD), Linux monitor network interface * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd/wl_roam.c b/drivers/net/wireless/bcmdhd/wl_roam.c index bf682469a59..6e92f5304de 100644 --- a/drivers/net/wireless/bcmdhd/wl_roam.c +++ b/drivers/net/wireless/bcmdhd/wl_roam.c @@ -1,7 +1,7 @@ /* * Linux roam cache * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -145,8 +145,8 @@ int set_roamscan_channel_list(struct net_device *dev, channel_list.n = n; /* need to set ROAMSCAN_MODE_NORMAL to update roamscan_channels, - otherwise, it won't be updated - */ + * otherwise, it won't be updated + */ wldev_iovar_setint(dev, "roamscan_mode", ROAMSCAN_MODE_NORMAL); error = wldev_iovar_setbuf(dev, "roamscan_channels", &channel_list, sizeof(channel_list), iobuf, sizeof(iobuf), NULL); @@ -278,7 +278,7 @@ void print_roam_cache(void) { int i; - WL_DBG(("%d cache\n", n_roam_cache)); + WL_DBG((" %d cache\n", n_roam_cache)); for (i = 0; i < n_roam_cache; i++) { roam_cache[i].ssid[roam_cache[i].ssid_len] = 0; diff --git a/drivers/net/wireless/bcmdhd/wldev_common.c b/drivers/net/wireless/bcmdhd/wldev_common.c index 8e0ed4dcf60..4e9389a000f 100644 --- a/drivers/net/wireless/bcmdhd/wldev_common.c +++ b/drivers/net/wireless/bcmdhd/wldev_common.c @@ -1,7 +1,7 @@ /* * Common function shared by Linux WEXT, cfg80211 and p2p drivers * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -109,6 +109,7 @@ s32 wldev_iovar_setbuf( ret = wldev_ioctl(dev, WLC_SET_VAR, buf, iovar_len, TRUE); else ret = BCME_BUFTOOSHORT; + if (buf_sync) mutex_unlock(buf_sync); return ret; @@ -335,7 +336,7 @@ int wldev_set_band( } int wldev_set_country( - struct net_device *dev, char *country_code) + struct net_device *dev, char *country_code, bool notify, bool user_enforced) { int error = -1; wl_country_t cspec = {{0}, 0, {0}}; @@ -345,20 +346,26 @@ int wldev_set_country( if (!country_code) return error; - error = wldev_iovar_getbuf(dev, "country", &cspec, sizeof(cspec), - smbuf, sizeof(smbuf), NULL); - if (error < 0) + bzero(&scbval, sizeof(scb_val_t)); + error = wldev_iovar_getbuf(dev, "country", NULL, 0, &cspec, sizeof(cspec), NULL); + if (error < 0) { WLDEV_ERROR(("%s: get country failed = %d\n", __FUNCTION__, error)); + return error; + } if ((error < 0) || - (strncmp(country_code, smbuf, WLC_CNTRY_BUF_SZ) != 0)) { - bzero(&scbval, sizeof(scb_val_t)); - error = wldev_ioctl(dev, WLC_DISASSOC, &scbval, sizeof(scb_val_t), true); - if (error < 0) { - WLDEV_ERROR(("%s: set country failed due to Disassoc error %d\n", - __FUNCTION__, error)); - return error; + (strncmp(country_code, cspec.country_abbrev, WLC_CNTRY_BUF_SZ) != 0)) { + + if (user_enforced) { + bzero(&scbval, sizeof(scb_val_t)); + error = wldev_ioctl(dev, WLC_DISASSOC, &scbval, sizeof(scb_val_t), true); + if (error < 0) { + WLDEV_ERROR(("%s: set country failed due to Disassoc error %d\n", + __FUNCTION__, error)); + return error; + } } + cspec.rev = -1; memcpy(cspec.country_abbrev, country_code, WLC_CNTRY_BUF_SZ); memcpy(cspec.ccode, country_code, WLC_CNTRY_BUF_SZ); @@ -370,7 +377,7 @@ int wldev_set_country( __FUNCTION__, country_code, cspec.ccode, cspec.rev)); return error; } - dhd_bus_country_set(dev, &cspec); + dhd_bus_country_set(dev, &cspec, notify); WLDEV_ERROR(("%s: set country for %s as %s rev %d\n", __FUNCTION__, country_code, cspec.ccode, cspec.rev)); } diff --git a/drivers/net/wireless/bcmdhd/wldev_common.h b/drivers/net/wireless/bcmdhd/wldev_common.h index f9bf42584ea..ca87b3c0889 100644 --- a/drivers/net/wireless/bcmdhd/wldev_common.h +++ b/drivers/net/wireless/bcmdhd/wldev_common.h @@ -1,7 +1,7 @@ /* * Common function shared by Linux WEXT, cfg80211 and p2p drivers * - * Copyright (C) 1999-2012, Broadcom Corporation + * Copyright (C) 1999-2013, Broadcom Corporation * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -84,9 +84,10 @@ s32 wldev_iovar_setint_bsscfg( struct net_device *dev, s8 *iovar, s32 val, s32 bssidx); extern void get_customized_country_code(char *country_iso_code, wl_country_t *cspec); -extern void dhd_bus_country_set(struct net_device *dev, wl_country_t *cspec); +extern void dhd_bus_country_set(struct net_device *dev, wl_country_t *cspec, bool notify); extern void dhd_bus_band_set(struct net_device *dev, uint band); -extern int wldev_set_country(struct net_device *dev, char *country_code); +extern int wldev_set_country(struct net_device *dev, char *country_code, bool notify, + bool user_enforced); extern int net_os_wake_lock(struct net_device *dev); extern int net_os_wake_unlock(struct net_device *dev); extern int net_os_wake_lock_timeout(struct net_device *dev); diff --git a/drivers/sensorhub/factory/temphumidity_shtc1.c b/drivers/sensorhub/factory/temphumidity_shtc1.c index 3c5c27c6fc9..3ccc4b380bb 100644 --- a/drivers/sensorhub/factory/temphumidity_shtc1.c +++ b/drivers/sensorhub/factory/temphumidity_shtc1.c @@ -69,8 +69,8 @@ static int cp_thm_get_adc_data(struct ssp_data *data) static int convert_adc_to_temp(struct ssp_data *data, unsigned int adc) { - u8 low = 0, mid = 0; - u8 high; + int low = 0, mid = 0; + int high; if (!data->cp_thm_adc_table || !data->cp_thm_adc_arr_size) { /* using fake temp */ diff --git a/drivers/sensorhub/ssp.h b/drivers/sensorhub/ssp.h index 43ebd204cc4..f52fc819e95 100644 --- a/drivers/sensorhub/ssp.h +++ b/drivers/sensorhub/ssp.h @@ -39,7 +39,7 @@ #include "ssp_sensorhub.h" #endif -#undef FEATURE_STEP_SENSOR +#define FEATURE_STEP_SENSOR #define SSP_DBG 1 #define SUCCESS 1 diff --git a/drivers/sensorhub/ssp_firmware.c b/drivers/sensorhub/ssp_firmware.c index 204113b1626..14abdd15487 100644 --- a/drivers/sensorhub/ssp_firmware.c +++ b/drivers/sensorhub/ssp_firmware.c @@ -14,7 +14,7 @@ */ #include "ssp.h" -#define SSP_FIRMWARE_REVISION_08 13092300/* MCU L5 */ +#define SSP_FIRMWARE_REVISION_08 14012000/* MCU L5 */ /* Bootload mode cmd */ #define BL_FW_NAME "ssp.fw" diff --git a/drivers/sensorhub/ssp_sysfs.c b/drivers/sensorhub/ssp_sysfs.c index f52c3be356a..f2e47ae8ba3 100644 --- a/drivers/sensorhub/ssp_sysfs.c +++ b/drivers/sensorhub/ssp_sysfs.c @@ -103,19 +103,13 @@ static void change_sensor_delay(struct ssp_data *data, break; default: - data->aiCheckStatus[iSensorType] = ADD_SENSOR_STATE; + break; } } /*************************************************************************/ /* SSP data enable function */ /*************************************************************************/ -#if 0 -static int ssp_add_sensor(struct ssp_data *data, unsigned int uChangedSensor) -{ - return 0; -} -#endif static int ssp_remove_sensor(struct ssp_data *data, unsigned int uChangedSensor, unsigned int uNewEnable) { @@ -127,20 +121,7 @@ static int ssp_remove_sensor(struct ssp_data *data, data->adDelayBuf[uChangedSensor] = DEFUALT_POLLING_DELAY; - if (data->aiCheckStatus[uChangedSensor] == INITIALIZATION_STATE) { - data->aiCheckStatus[uChangedSensor] = NO_SENSOR_STATE; - if (uChangedSensor == ACCELEROMETER_SENSOR) - accel_open_calibration(data); - else if (uChangedSensor == GYROSCOPE_SENSOR) - gyro_open_calibration(data); - else if (uChangedSensor == PRESSURE_SENSOR) - pressure_open_calibration(data); - else if (uChangedSensor == PROXIMITY_SENSOR) { - proximity_open_lcd_ldi(data); - proximity_open_calibration(data); - } - return 0; - } else if (uChangedSensor == ORIENTATION_SENSOR) { + if (uChangedSensor == ORIENTATION_SENSOR) { if (!(atomic_read(&data->aSensorEnable) & (1 << ACCELEROMETER_SENSOR))) { uChangedSensor = ACCELEROMETER_SENSOR; @@ -183,6 +164,29 @@ static ssize_t show_sensors_enable(struct device *dev, return sprintf(buf, "%9u\n", atomic_read(&data->aSensorEnable)); } +static void ssp_load_cal_data(struct ssp_data *data, unsigned int uChangedSensor) +{ + switch (uChangedSensor) { + case ACCELEROMETER_SENSOR : + accel_open_calibration(data); + break; + case GYROSCOPE_SENSOR : + gyro_open_calibration(data); + break; + case PRESSURE_SENSOR : + pressure_open_calibration(data); + break; + case PROXIMITY_SENSOR : + proximity_open_lcd_ldi(data); + proximity_open_calibration(data); + break; + default : + break; + } + pr_info("[SSP] : %s, uChangedSensor : 0x%x\n", __func__, uChangedSensor); + +} + static ssize_t set_sensors_enable(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) { @@ -207,11 +211,13 @@ static ssize_t set_sensors_enable(struct device *dev, if (!(uNewEnable & (1 << uChangedSensor))) ssp_remove_sensor(data, uChangedSensor, uNewEnable); /* disable */ -#if 0 /* In case of enabling, we will send instruction on change_sensor_delay. */ - else - ssp_add_sensor(data, uChangedSensor); -#endif - + else /* Change to ADD_SENSOR_STATE from KitKat */ { + if (data->aiCheckStatus[uChangedSensor] == INITIALIZATION_STATE) { + /* Load calibration data */ + ssp_load_cal_data(data, uChangedSensor); + } + data->aiCheckStatus[uChangedSensor] = ADD_SENSOR_STATE; + } break; } diff --git a/firmware/ssp.fw.ihex b/firmware/ssp.fw.ihex index 3d2a8a90281..338544ed3b5 100644 --- a/firmware/ssp.fw.ihex +++ b/firmware/ssp.fw.ihex @@ -1,7935 +1,8047 @@ -:10000000000D02F1EC5601002000010000E7F901AB -:100010000D02F1EC56030000000100482D483FD7C7 -:10002000030000000080008001AEF4EBCD40E0183A -:100030009730565907C235E0653CACEA150000ED33 -:10004000B70000C0C2301CAADCAAEC30CCAAFC0A63 -:100050009C2F8CE0A0A9E418962F8630CCE0A0A9B4 -:1000600065FE360005EB5601F45C86F9D6B010A9A2 -:100070004CAA8CAA96AAA7AABCAAC6E3CF90E080F5 -:100080000174008001730CD401E0A026A1E06B2D67 -:1000900014EA1B00002B0C198CB68C169CD802E0BD -:1000A0006C2D14EA1C0000E06B00C7B88BE06B00FD -:1000B000C5B89BE06B00CCB8AB5EFCEBCD408018C4 -:1000C000975807C031E3CF8080E0A0C9A3300BC0B0 -:1000D00098EE0B070AF80B00092829B28A2FFB5C5F -:1000E0005B584BCF75E3CF90800000EBCD40E02014 -:1000F0001D1896300CBA8CE0A0C98C1895300758A2 -:1001000006C031300CC1E8E0A026622C0C988CEDC2 -:10011000BC0005C033301CC1580D8C001C9B001363 -:1001200002F1EC56040020000080010021000100D3 -:1001300000CB7A010D02F1EC56030000000100EB48 -:100140006C00820D9CEB6C0083301B1A9CE06A3FB4 -:1001500020EA1A0000745A74BA746A5D1AC020301A -:10016000170E9C5C5C2FFDE3CD80E0EBCD40802042 -:100170001D300BBA8B198CBA8CE06C3F20EA1C0046 -:100180000078476EBC782C5D1CC031300CC0D83074 -:100190001A1A9B305C6EB972895D19CF806EBC787B -:1001A0001C5D1CCF40301C2FFDE3CD80800000EB98 -:1001B000CD408018975807C031E3CF8080E0A0C9B8 -:1001C0003B0F8BF96B0084F93C0084580CC0603203 -:1001D0002CE0A02993E3CF9080E06B3F20EA1B0046 -:1001E00000765C199A768C199C180A764C199C1822 -:1001F0000A5C5AC041322CE0A02990E3CF90808065 -:100200000074B8800074D8D401E0A025F3E06B2D11 -:1002100014EA1B0000F91A0040A94AB68A2C0C986F -:100220008CB69C169CD802D631300730063005308B -:10023000043003E0603EA5EA100000300CA08C0002 -:100240007128001302F1EC56040021000080010027 -:1002500022000100005EB1010D02F1EC5603000026 -:10026000000100E0A0C8FA1892FB2C0007E0A0569D -:10027000D3C080E06C00C8C6CC3C8CA08C3C87C34B -:1002800038CA5CC0213016FB2C0007E0A06B7E183A -:1002900091E5610064E51C005E580CC060FB2C0019 -:1002A00007E0A0C7151893658C580CC060FB2C00A4 -:1002B00007E0A056C9189529A2848C580CC040E0CC -:1002C000A0624618945C61C0915C64C0715C65C0BA -:1002D000515C66C0315C63C070E06C00C4C39C3C80 -:1002E000473C4CA08C0E9C5C6CDC328000CFB08014 -:1002F00000F9248001B0688000CFE08000E6E8EBE0 -:10030000CD4080E0A0C8AA1897EF1C005E580CC032 -:1003100030E0A056C36F8C580CC030E0A056BE2908 -:10032000A78E8C580CC030E0A06232E0A026D4E347 -:10033000CF80808000D0348000E72880007070E09B -:100340006B3EA2EA1B0000F72C00005EFC0000E000 -:100350006B3EA3EA1B0000E04C00CFC071178AF48B -:10036000091518002EC8001302F1EC5604002200F3 -:10037000008001002300010000E10A010D02F1EC00 -:1003800056030000000100C030B69AC038300AB6EB -:100390009AB68C5EFD0000E06C3EA3EA1C000019DA -:1003A0008C5EFCD401E0A00AE5CBDFD80A0000EBAC -:1003B000CD40C0E0672D14EA1700003006EF66005C -:1003C000FCE0A006A9C071AE96E06C00C4AE8CEF54 -:1003D0006600FCEF6600FDEF6600FEEF660100EFD1 -:1003E0006600FFEF6601010E9CE3CD80C00000E0D7 -:1003F0006C2D14EA1C0000F93B00FD580B5E1DF942 -:100400003B0100580B5E1DF93B00FF580B5E1DF9C8 -:100410003B0101580B5E1DF93C00FE580C5E1D5E51 -:10042000FF0000EBCD40F8201D189616975806C027 -:1004300040EE0C1518C041300CE08F06693005C144 -:1004400038E60C000B17CBE93A00FCE80A0B0BE985 -:100450003B00FC2FFBE96B00FC2FFC5C6C581CCFB5 -:10046000152FF55C650E35E0840651EA0310680C23 -:1004700003E0642D14EA140000078CE93B00FCE85B -:100480000B0B0CE93C00FC0022EF001302F1EC56D0 -:1004900004002300008001002400010000F5220177 -:1004A0000D02F1EC560300000001002FFCE96C0086 -:1004B000FC078C585CF9BC0205FE0C001C984C181B -:1004C0000F000E04520B10041403DAFF9C07ACE972 -:1004D0003B00FCE80B0B0CE93C00FC2FFCE96C003A -:1004E000FC07AC589CF9BC02092FECFE0C001FC0A5 -:1004F000A8C498C888CC78CFC8C249C989C379C86C -:10050000B9CADB862CA94CE93B00FCE80B0B0CE9D3 -:100510003C00FC2FFCE96C00FC862CE93B00FCE86D -:100520000B0B0CE93C00FC2FFCE96C00FC863CA9A1 -:100530004CE93B00FCE80B0B0CE93C00FC2FFCE910 -:100540006C00FC863CE93B00FCE80B0B0CE93C0032 -:10055000FC2FFCE96C00FC864CA94CE93B00FCE854 -:100560000B0B0CE93C00FC2FFCE96C00FC864CE911 -:100570003B00FCE80B0B0CE93C00FC2FFCE96C0099 -:10058000FCC82B862CA94CE93B00FCE80B0B0CE9C2 -:100590003C00FC2FFCE96C00FC862CE93B00FCE8ED -:1005A0000B0B0CE93C00FC2FFCE96C0069C6001346 -:1005B00002F1EC5604002400008001002500010037 -:1005C000009F9A010D02F1EC5603000000010000AB -:1005D000FC863CA94CE93B00FCE80B0B0CE93C0019 -:1005E000FC2FFCE96C00FC863CE93B00FCE80B0BB3 -:1005F0000CE93C00FC2FFCE96C00FC864CA94CE9A2 -:100600003B00FCE80B0B0CE93C00FC2FFCE96C0008 -:10061000FC864CE93B00FCE80B0B0CE93C00FC2F92 -:10062000FCE96C00FCC42B862CA94CE93B00FCE8DF -:100630000B0B0CE93C00FC2FFCE96C00FC862CE960 -:100640003B00FCE80B0B0CE93C00FC2FFCE96C00C8 -:10065000FC863CA94CE93B00FCE80B0B0CE93C0098 -:10066000FC2FFCE96C00FC863CE93B00FCE80B0B32 -:100670000CE93C00FC2FFCE96C00FC864CA94CE921 -:100680003B00FCE80B0B0CE93C00FC2FFCE96C0088 -:10069000FC864CE93B00FCE80B0B0CE93C00FC2F12 -:1006A000FCE96C00FCC02B661CB14CE93B00FCE88B -:1006B0000B0B0CE93C00FC2FFCE96C00FC661CA950 -:1006C0004CE93B00FCE80B0B0CE93C00FC2FFC0068 -:1006D000B527001302F1EC5604002500008001004C -:1006E00026000100000A51010D02F1EC5603000042 -:1006F000000100E96C00FC661CE93B00FCE80B0B08 -:100700000CE93C00FC2FFCE96C00FC864CA94CE990 -:100710003B00FCE80B0B0CE93C00FC2FFCE96C00F7 -:10072000FC864CE93B00FCE80B0B0CE93C00FC2F81 -:10073000FCE96C00FCCCCA862CE93B00FCE80B0B06 -:100740000CE93C00FC2FFCE96C00FC863CE93B001A -:10075000FCE80B0B0CE93C00FC2FFCE96C00FC8670 -:100760004CE93B00FCE80B0B0CE93C00FC2FFCE9DE -:100770006C00FC865CE93B00FCE80B0B0CE93C00E0 -:10078000FC2FFCE96C00FCCA3A07CCE93B00FCE812 -:100790000B0B0CE93C00FC2FFCE96C00FC07DCE9CE -:1007A0003B00FCE80B0B0CE93C00FC2FFCE96C0067 -:1007B000FCC8EA862CA94CE93B00FCE80B0B0CE9D1 -:1007C0003C00FC2FFCE96C00FC862CE93B00FCE8BB -:1007D0000B0B0CE93C00FC2FFCE96C00FC863CA9EF -:1007E0004CE93B00FCE80B0B0CE93C00FC2FFCE95E -:1007F0006C00FC00BD37001302F1EC56040026002B -:10080000008001002700010000B5EA010D02F1ECB3 -:1008100056030000000100863CE93B00FCE80B0B9E -:100820000CE93C00FC2FFCE96C00FC864CA94CE96F -:100830003B00FCE80B0B0CE93C00FC2FFCE96C00D6 -:10084000FC864CE93B00FCE80B0B0CE93C00FC2F60 -:10085000FCE96C00FC865CA94CE93B00FCE80B0B56 -:100860000CE93C00FC2FFCE96C00FC865CE93B00D9 -:10087000FCE80B0B0CE93C00FC2FFCE96C00FCC312 -:100880009A07CCE93B00FCE80B0B0CE93C00FC2F81 -:10089000FCE96C00FCC2EA862CA94CE93B00FCE8B0 -:1008A0000B0B0CE93C00FC2FFCE96C00FC862CE9EE -:1008B0003B00FCE80B0B0CE93C00FC2FFCE96C0056 -:1008C000FC863CA94CE93B00FCE80B0B0CE93C0026 -:1008D000FC2FFCE96C00FC863CE93B00FCE80B0BC0 -:1008E0000CE93C00FC2FFCE96C00FC2F83078CE931 -:1008F0003B00FCE80B0B0CE93C00FC2FFCE96C0016 -:10090000FCFE9FFDF8E93C00FC080C300BF96BFF86 -:10091000FF07ABB88BE93C002238001302F1EC561C -:1009200004002700008001002800010000220101CE -:100930000D02F1EC5603000000010000FC2FFCE961 -:100940006C00FC07AC58ACFE91FDD207CCE93B0033 -:10095000FCE80B0B0CE93C00FC2FFCE96C00FCFEF6 -:100960009FFDDB07ACE93B00FCE80B0B0CE93C000E -:10097000FC2FFCE96C00FC07AC069B2FCBE93A008E -:10098000FC080A1498580CC0501739201C10C9CF05 -:10099000D107ACE93B00FC180BE96B00FCFE9FFDA6 -:1009A000BC079C581CC050079C583CE08102D807EB -:1009B0009C581CC0C1301CE93B00FCE80B0B0CE947 -:1009C0003C00FC2FFCE96C00FCC0E8079C583CC0D4 -:1009D000B1303CE93B00FCE80B0B0CE93C00FC2F80 -:1009E000FCE96C00FC07AC202C5C5C591CF9BC02D7 -:1009F00002FE0C001C984C180F04660024FAF40444 -:100A0000660466046604660466046604660492046A -:100A100066046604660466FAF4046607ACE93B0003 -:100A2000FCE80B0B0CE93C00FC2FFCE96C00FC071C -:100A30009C583CC13107CCE93B00FC00FB1600137D -:100A400002F1EC560400280000800100290001009A -:100A50000062BA010D02F1EC56030000000100E84B -:100A60000B0B0CE93C00FC2FFCE96C00FC07CC50A4 -:100A70000CE06CC1B0EA1C8001E0A0236707DCE950 -:100A80003B00FCE80B0B0CE93C00FC2FFCE96C0084 -:100A9000FCE93C00FC080C07DBEDBB0007E0830031 -:100AA0009BE73B0008B88BE93C00FC2FFCE96C009D -:100AB000FCE73C0009E93B00FCE80B0B0CE93C00BF -:100AC000FC2FFCE96C00FC300CE93B00FCE80B0B54 -:100AD0000CE93C00FC2FFCE96C00FCE73C000AE957 -:100AE0003B00FCE80B0B0CE93C00FC2FFCE96C0024 -:100AF000FCE71C0012A94CE93B00FCE80B0B0CE9DD -:100B00003C00FC2FFCE96C00FCE71C0012E93B00F8 -:100B1000FCE80B0B0CE93C00FC2FFCE96C00FCE74B -:100B20003C0014E93B00FCE80B0B0CE93C00FC2FFB -:100B3000FCE96C00FCE73C0015E93B00FCE80B0B12 -:100B40000CE93C00FC2FFCE96C00FCE73C0016E9DA -:100B50003B00FCE80B0B0CE93C00FC2FFCE96C00B3 -:100B6000E1BD001302F1EC560400290000800100F1 -:100B70002A00010000F771010D02F1EC560300009C -:100B800000010000FCE73C0017E93B00FCE80B0B10 -:100B90000CE93C00FC2FFCE96C00FCE73C000BE995 -:100BA0003B00FCE80B0B0CE93C00FC2FFCE96C0063 -:100BB000FCE73C000CE93B00FCE80B0B0CE93C00BB -:100BC000FC2FFCE96C00FCE73C000DE93B00FCE875 -:100BD0000B0B0CE93C00FC2FFCE96C00FC2F2307FD -:100BE0008CE93B00FCE80B0B0CE93C00FC2FFCE91A -:100BF0006C00FCFE9FFCB5662BB18BB88BE93C000A -:100C0000FC2FFCE96C00FC662CA98CE93B00FCE89D -:100C10000B0B0CE93C00FC2FFCE96C00FC662CE99A -:100C20003B00FCE80B0B0CE93C00FC2FFCE96C00E2 -:100C3000FC663CB18CE93B00FCE80B0B0CE93C008A -:100C4000FC2FFCE96C00FC663CA98CE93B00FCE84D -:100C50000B0B0CE93C00FC2FFCE96C00FC663CE94A -:100C60003B00FCE80B0B0CE93C00FC2FFCE96C00A2 -:100C7000FC664CB18CE93B00FCE80B0B0CE93C003A -:100C8000FC2FFC00ED4E001302F1EC5604002A008C -:100C9000008001002B0001000048CA010D02F1ECA8 -:100CA00056030000000100E96C00FC664CA98CE9C9 -:100CB0003B00FCE80B0B0CE93C00FC2FFCE96C0052 -:100CC000FC664CE93B00FCE80B0B0CE93C00FC2FFC -:100CD000FCE96C00FC665CB18CE93B00FCE80B0BAA -:100CE0000CE93C00FC2FFCE96C00FC665CA98CE97B -:100CF0003B00FCE80B0B0CE93C00FC2FFCE96C0012 -:100D0000FC665CE93B00FCE80B0B0CE93C00FC2FAB -:100D1000FCE96C00FC66BCB18CE93B00FCE80B0B09 -:100D20000CE93C00FC2FFCE96C00FC66BCA98CE9DA -:100D30003B00FCE80B0B0CE93C00FC2FFCE96C00D1 -:100D4000FC66BCE93B00FCE80B0B0CE93C00FC2F0B -:100D5000FCE96C00FCE73C0030E93B00FCE80B0BD5 -:100D60000CE93C00FC2FFCE96C00FCE73C0031E99D -:100D70003B00FCE80B0B0CE93C00FC2FFCE96C0091 -:100D8000FCE71C0032A94CE93B00FCE80B0B0CE92A -:100D90003C00FC2FFCE96C00FCE71C0032E93B0046 -:100DA000FCE80B0B0CE93C009EDD001302F1EC5655 -:100DB00004002B00008001002C000100005CE20117 -:100DC0000D02F1EC5603000000010000FC2FFCE9CD -:100DD0006C00FCE73C0034E93B00FCE80B0B0CE941 -:100DE0003C00FC2FFCE96C00FC666CB18CE93B001C -:100DF000FCE80B0B0CE93C00FC2FFCE96C00FC66EA -:100E00006CA98CE93B00FCE80B0B0CE93C00FC2FC7 -:100E1000FCE96C00FC666CE93B00FCE80B0B0CE9A0 -:100E20003C00FC2FFCE96C00FC667CB18CE93B00CB -:100E3000FCE80B0B0CE93C00FC2FFCE96C00FC66A9 -:100E40007CA98CE93B00FCE80B0B0CE93C00FC2F77 -:100E5000FCE96C00FC667CE93B00FCE80B0B0CE950 -:100E60003C00FC2FFCE96C00FC668CB18CE93B007B -:100E7000FCE80B0B0CE93C00FC2FFCE96C00FC6669 -:100E80008CA98CE93B00FCE80B0B0CE93C00FC2F27 -:100E9000FCE96C00FC668CE93B00FCE80B0B0CE900 -:100EA0003C00FC2FFCE96C00FC669CB18CE93B002B -:100EB000FCE80B0B0CE93C00FC2FFCE96C00FC6629 -:100EC0009CA98CE93B00FCE80B0B0C0005D100133E -:100ED00002F1EC5604002C00008001002D000100FE -:100EE00000365A010D02F1EC56030000000100E942 -:100EF0003C00FC2FFCE96C00FC669CE93B00FCE834 -:100F00000B0B0CE93C00FC2FFCE96C00FCFE9FFB8A -:100F10005E07ACE93B00FCE80B0B0CE93C00FC2F46 -:100F2000FCE96C00FC07CCE93B00FCE80B0B0CE98E -:100F30003C00FC2FFCE96C00FCFE9FFB4807ACE981 -:100F40003B00FCE80B0B0CE93C00FC2FFCE96C00BF -:100F5000FC07CCE93B00FCE80B0B0CE93C00FC2F48 -:100F6000FCE96C00FC07DCE93B00FCE80B0B0CE93E -:100F70003C00FC2FFCE96C00FC07ECE93B00FCE8C2 -:100F80000B0B0CE93C00FC2FFCE96C00FC864CA927 -:100F90004CE93B00FCE80B0B0CE93C00FC2FFCE9A6 -:100FA0006C00FC864CE93B00FCE80B0B0CE93C00B8 -:100FB000FC2FFCE96C00FC865CA94CE93B00FCE8DA -:100FC0000B0B0CE93C00FC2FFCE96C00FC865CE997 -:100FD0003B00FCE80B0B0CE93C00FC2FFCE96C002F -:100FE000FC866CA94CE93B00FCE80B0B0CE93C00CF -:100FF000732C001302F1EC5604002D000080010058 -:101000002E00010000A391010D02F1EC5603000037 -:1010100000010000FC2FFCE96C00FC866CE93B0041 -:10102000FCE80B0B0CE93C00FC2FFCE96C00FCFE1F -:101030009FFADF079C582CC4E1302CE93B00FCE808 -:101040000B0B0CE93C00FC2FFCE96C00FC07AC58D6 -:101050004CFE91FAB907ACE93B00FCE80B0B0CE93C -:101060003C00FC2FFCE96C00FC07CCE93B00FCE8F1 -:101070000B0B0CE93C00FC2FFCE96C00FC07DCE9E5 -:101080003B00FCE80B0B0CE93C00FC2FFCE96C007E -:10109000FC07ECE93B00FCE80B0B0CE93C00FC2FE7 -:1010A000FCE96C00FC07FCE93B00FCE80B0B0CE9DD -:1010B0003C00FC2FFCE96C00FC2F83078CE93B0013 -:1010C000FCE80B0B0CE93C00FC2FFCE96C00FCFE7F -:1010D0009FFA8F079C583CFE91FA76303CE93B0022 -:1010E000FCE80B0B0CE93C00FC2FFCE96C00FC0756 -:1010F000AC589CFE91FA6807ACE93B00FCE80B0B8E -:101100000CE93C00FC2FFCE96C00FC07CCE93B003F -:10111000FCE80B00DEE1001302F1EC5604002E00A7 -:10112000008001002F000100001C2A010D02F1ECDB -:10113000560300000001000B0CE93C00FC2FFCE909 -:101140006C00FC07DCE93B00FCE80B0B0CE93C0005 -:10115000FC2FFCE96C00FCFE9FFA5D300C07ABE94C -:101160003A00FCE80A0B0BE93B00FC2FFBE96B00A3 -:10117000FC07AB58ABF9BB0203FE0B001B964B16EA -:101180000F0016003A0060F468008400A800CC004C -:10119000F00114F48C5C6C581CFE94FA3CE60C00D4 -:1011A0000B17CBE93A00FCE80A0B0BE93B00FC2FDC -:1011B000FBE96B00FC2FFCCEFB5C6CE04C0022FEDC -:1011C00094FA29E60C000B17CBE93A00FCE80A0B6D -:1011D0000BE93B00FC2FFBE96B00FC2FFCCEEB5C2A -:1011E0006C586CFE94FA17E60C000B17CBE93A002A -:1011F000FCE80A0B0BE93B00FC2FFBE96B00FC2F22 -:10120000FCCEFB5C6C581CFE94FA05E60C000B1738 -:10121000CBE93A00FCE80A0B0BE93B00FC2FFBE9A9 -:101220006B00FC2FFCCEFB5C6C585CFE94F9F3E683 -:101230000C000B17CBE93A0022DC001302F1EC564C -:1012400004002F000080010030000100000C42016A -:101250000D02F1EC5603000000010000FCE80A0B4F -:101260000BE93B00FC2FFBE96B00FC2FFCCEFB5C89 -:101270006C581CFE94F9E1E60C000B17CBE93A0020 -:10128000FCE80A0B0BE93B00FC2FFBE96B00FC2F91 -:10129000FCCEFB5C6C581CFE94F9CFE60C000B17DF -:1012A000CBE93A00FCE80A0B0BE93B00FC2FFBE919 -:1012B0006B00FC2FFCCEFB5C6CE04C0038FE94F91C -:1012C000BCE60C000B17CBE93A00FCE80A0B0BE973 -:1012D0003B00FC2FFBE96B00FC2FFCCEEB301C2FFE -:1012E000FDE3CD80F80000EBCD40E0E0672D14EA8F -:1012F000170000302CEF6C00FCE0662FACEA160003 -:1013000000EF3B00FD0C9C298CFEB0F9771895EF9F -:101310003B00FE0C9CFE3CF9E8FEB0F96F1845EF6F -:101320003B01000C9CFEB0F9691845EF3B00FF0C37 -:101330009CFE3CF778FEB0F9611845EF3B0101FED9 -:1013400036F7100C9CFEB0F95918455815C0F1EF4E -:101350003C00FCFE3CFF02EF6C00FC005F8C0013C5 -:1013600002F1EC5604003000008001003100010061 -:101370000018FF010D02F1EC56030000000100EF20 -:101380003C00FCAE9CE06C00C4AE8CE3CF90E0303F -:101390000CEF6C00FCE3CF80E00000E06C3CACEABA -:1013A0001C0000E06B00C8B88B311BB89B5EFCD4FE -:1013B00001FEB0F76FE06C3CACEA1C0000D80230D4 -:1013C0000CE06B3CACEA1B0000F75C01F45EFFEB49 -:1013D000CD4080201D1A9B300AB68AB69AB6AA590B -:1013E0000CC065CE6F1897CECF0E9CC1C8581CC1DB -:1013F000911A9CE0A0C092E06C2D14EA1C00001B26 -:101400008BB8DB1B9BB8EB1BABB8FB304BF96B000D -:10141000FC300AB88AB89B3019B8A9B8BAB8CBC0A2 -:1014200028300C2FFDE3CD8080D7038001B298D403 -:1014300031217D189716905807C040E00C1518C050 -:1014400041300CE08F036DE0A01DF4516C30023090 -:1014500006FB560054FB66002D30A5FB65002EFBF5 -:10146000660030FB660031E0612FA8EA110000A29F -:10147000863004C068A2963012038C2FFCA28C0028 -:101480007B0C001302F1EC560400310000800100D7 -:1014900032000100008D34010D02F1EC5603000012 -:1014A000000100E0041800E082034B5C54EE0407E6 -:1014B0000CE0632E18EA130000038BF609102806CF -:1014C00009B28C2FF4E04C00A1C4A15C54EE0407D7 -:1014D0000CB29C2FF45C54EE04070CB2CC2FF45CDD -:1014E00054EE04070CB2DC2FF4139C58ACC0B51AB0 -:1014F0009C328A130B18AB204ACFD1E0A0B08818D9 -:1015000092CCEB300A13CB5C6B139C5C6CE0A09923 -:10151000651892038CF80C10281803079C585CCBB4 -:10152000F1300CFB6C002C311CFB6C002DFACCFF55 -:10153000D02FC3324A070B18AB204ACFD1FB65002E -:101540002EFB560054FACCFFD41A9B32C9190A1646 -:10155000AA2049CFD1E0A090911892CA1BE04C007C -:10156000A2C4B15C54EE04070CB29C2FF45C54EEA0 -:1015700004070CB2CC2FF45C54EE04070CB2DC2F41 -:10158000F4139C58ACC0B51A9C328A130B18AB20CC -:101590004ACFD1E0A0B0781892C82B300A13CB5CA8 -:1015A0006B139C0035EA001302F1EC560400320084 -:1015B000008001003300010000328F010D02F1ECC8 -:1015C000560300000001005C6CE0A0996B189203C8 -:1015D0008CF80C10281803079C585CFE91FF7330A0 -:1015E0001CFB6C002C311CFB6C002DFACCFFD02FA7 -:1015F000C3324A070B18AB204ACFD1FB65002EFB44 -:10160000560054FACCFFD41A9B32C9190A16AA20E4 -:1016100049CFD1E0A090441892C54BE04C00A4C142 -:10162000E15C54EE04070CB29C2FF45C54EE04070A -:101630000CB2CC2FF45C54EE04070CB2DC2FF41384 -:101640009C58ACC0353012C3DB300A13CB5C6B1333 -:101650009C5C6CE0A099781892C34BE04C00A8C247 -:10166000815C54EE04070CB29C2FF45C54EE04072A -:101670000CB2CC2FF45C54EE04070CB2DC2FF41344 -:101680009C500CE06CC2A0EA1C8001E0A01E12037A -:101690008CF80C1028180307CB079C5C6CE0A05555 -:1016A0005D1892F7D2C008416CE0A020FDC0ABE00D -:1016B0004C00B8C2F15C54EE04000C198CB29C2FA3 -:1016C000F45C54EE04000B00E5B0001302F1EC569C -:1016D0000400330000800100340001000026A7014F -:1016E0000D02F1EC56030000000100583C178CC1BC -:1016F00041F36C00082FF4581CC0D15C54EE040078 -:101700000B178C2F79B28C2FF45C6CE0A08FC0305B -:1017100012CEAA3002CE8AB2CC2FF45C54EE04076B -:101720000CB2DC2FF413CB5C6B139C5C6CE0A04F11 -:101730001B1892CD9AE04C00C1E08100D05C54EEC1 -:1017400004000C198CB29C2FF458ECC22130ECB27E -:10175000CC5C54EE04070CF36C00082FF45C54EEE0 -:1017600004070CF36C00092FF45C54EE04070AF331 -:101770006A000A2FF45C6AF33B00095C6B2F891343 -:101780008C5C6CE0A0BF2EE0A08F7C3012CACA59DE -:101790002CC281312CB2CC5C54EE04070CF36C00EB -:1017A000082FF4306CFB6C002C139CFB6C002DFAA2 -:1017B000CCFFD02FC9324A130B18AB204ACFD130FF -:1017C000BCFB6C002EFB560054FACCFFD41A9B32A3 -:1017D000C9190A16AA2049CFD1E0A08F731892C860 -:1017E0003A593CC281313CB2CC5C540034A600135F -:1017F00002F1EC56040034000080010035000100C5 -:10180000004C1F010D02F1EC56030000000100EE38 -:1018100004070CF36C00092FF4306CFB6C002C13E4 -:101820009CFB6C002DFACCFFD02FC9324A130B1849 -:10183000AB204ACFD130BCFB6C002EFB560054FAD3 -:10184000CCFFD41A9B32C9190A16AA2049CFD1E07D -:10185000A08F4A1892C5AA594CC281314CB2CC5CB7 -:1018600054EE04070CF36C000A2FF4306CFB6C0090 -:101870002C139CFB6C002DFACCFFD02FC9324A13DD -:101880000B18AB204ACFD130BCFB6C002EFB5600AE -:1018900054FACCFFD41A9B32C9190A16AA2049CF90 -:1018A000D1E0A08F211892C31A595CFE91FF4631F6 -:1018B0005CB2CC5C54EE04070CF36C00082FF430DF -:1018C0006CFB6C002C139CFB6C002DFACCFFD02F12 -:1018D000C9324A130B18AB204ACFD130BCFB6C0085 -:1018E0002EFB560054FACCFFD41A9B32C9190A16A3 -:1018F000AA2049CFD1E0A08EF71892C07A138CE0CD -:101900004C00B1E08101275C54EE04000C198C00FE -:101910004D68001302F1EC56040035000080010010 -:101920003600010000D9D4010D02F1EC560300008D -:10193000000100B29C2FF45C6CE0A04951581C03DC -:101940008CF80C1028E08100E1060C199B583BC173 -:10195000415C54EE04070BF96B00082FF45C54EE65 -:1019600004070BF96B00092FF45C54EE04070B2FEE -:101970006CB88B2FF4CD48589BC2915C54EE040791 -:101980000BA96B2FF45C54EE04070A140B2FF4B868 -:101990004B5C54EE04070BA96B2FF45C54EE040768 -:1019A0000A140B2FF4B85B5C54EE04070BA96B2FE1 -:1019B000F45C54EE04070A140B2FF4B86B5C54EE7D -:1019C00004070B2F2CB88B2FF4CAA8581BC7515CE7 -:1019D00054EE04000B178AF96A00082FF45C54EEE9 -:1019E00004000B5C5A178BC1F1F96B00092FF45CF2 -:1019F00054EE04070BF96B000A2FF45C54EE040755 -:101A00000BF96B000B2FF4300B5C6B58DBE08400A0 -:101A1000885C54EE04070AF80B00092E69B28A2F7D -:101A2000F42FFBCF3BB96B2FF45C54EE04070AB1E3 -:101A30006A140B00DF9C001302F1EC560400360020 -:101A4000008001003700010000666F010D02F1EC1B -:101A5000560300000001002FF45C54EE04070AA9AD -:101A60006A140B2FF45C54EE04070A140B2FF4993C -:101A70003B5C54EE04070BB96B2FF45C54EE040787 -:101A80000AB16A140B2FF45C54EE04070AA96A1415 -:101A90000B2FF45C54EE04070A140B2FF4994B5CE3 -:101AA00054EE04070BB16B2FF45C54EE04070AA943 -:101AB0006A140B2FF45C54EE04070A140B2FF499EC -:101AC0005B5C54EE04070BF96B00182FF45C54EECA -:101AD00004070B2E7CB88B2FF4C34858CBC1315C64 -:101AE00054EE04070BF96B00082FF45C54EE040766 -:101AF0000BA96B2FF45C54EE04070A140B2FF4B8F7 -:101B00005BC20858DBC1E15C54EE04070BF96B00C3 -:101B1000082FF45C54EE04070BA96B2FF45C54EE11 -:101B200004070A140B2FF4B85BC0C8060C5C54EE13 -:101B300004070BB8CB2FF45C54EE04070BB8DB2F73 -:101B4000F4038CF80C10281803069C199B585BC2F0 -:101B500000300AFB6A002C00F16A001302F1EC5617 -:101B600004003700008001003800010000F184010A -:101B70000D02F1EC56030000000100FB6B002DFA92 -:101B8000CBFFD02FCC3249190A16AA2049CFD13029 -:101B9000BCFB6C002EFB560054FACCFFD41A9B32CF -:101BA000C9190A16AA2049CFD1E0A08DD31892FEF8 -:101BB0009FFCE3301CA29C3012FE9FFCDEE04C0038 -:101BC000B2FE91FCDA5C54EE04070CB29C2FF45C7C -:101BD00054EE04070CB2CC2FF45C54EE04070CB2A4 -:101BE000DC2FF4139C585CFE90FCC5301BFB6B0093 -:101BF0002CFB6C002D30BCFB6C002EFACCFFD41AF1 -:101C00009B32C9190A16AA2049CFD1E0A08DA2188B -:101C100092FE9FFCB2049C5C5C2E9DD832D7038060 -:101C200001936880016534800193E0800165D8806C -:101C300001667C80006FE88000DE90800075DC80AB -:101C40000153A08000D2788001B2F48001539480C7 -:101C500000C8A8800153D4E06C2FA8EA1C0000192A -:101C60009C5EFCD421E0A0BD851897E0A01A601806 -:101C70009630053004EF2C0064580C00148D0013CE -:101C800002F1EC5604003800008001003900010028 -:101C900000B13F010D02F1EC56030000000100C04D -:101CA000E0E06B2D14EA1B0000FE3BFF03E06C2F0D -:101CB000ACEA1C0000298CE0A08B24EF1C005E58CD -:101CC0000CC0F0E06B2D14EA1B0000FE3BFF02E0AD -:101CD0006C2FACEA1C0000FE3CF9E8E0A0B1AEEDD0 -:101CE0003C005B581CC235E06C2D14EA1C0000E07F -:101CF0006A2FACEA1A0000F93B0100F60B106814D9 -:101D00000B303AB68AED3A005BB6AAED3A005B2A90 -:101D1000462FCB1698580AC0500D39201A10C9CF3B -:101D2000D1301BF96B0100C0282FF45C6458A4C0AB -:101D3000A4E06C3EA8EA1C0000F804060B581BCF78 -:101D40005130155C655815C0F5E06B2D14EA1B0089 -:101D500000FE3BFF01E06C2FACEA1C0000FE3CF7EC -:101D600078E0A056C96F8C580CC0F0E06B2D14EAD7 -:101D70001B0000FE3BFEFFE06C2FACEA1C0000FEE7 -:101D80003CF710E0A04BD8D82AD7038001B3F480E9 -:101D9000006DB080014F6080019C988000E7540086 -:101DA000AC26001302F1EC5604003900008001005B -:101DB0003A0001000024F4010D02F1EC560300008A -:101DC0000001008000D194300BF96B000DE06B3FF7 -:101DD00020EA1B000076ABF71A005C3019F92800E6 -:101DE00000F208094C184A2A4BB60A5EFF00003080 -:101DF0000BF96B000DE06B3F20EA1B000076ABF7A0 -:101E00001A005C3019F9280000F208094C188A2AD7 -:101E10004BB60A5EFF00005EFF0000EBCD40F820ED -:101E20004D189516941297EA0A001C0E0C5817C00C -:101E300050F92B0015580BC1012EBCF92B00002FB7 -:101E4000FBB88BEA07000C2DFCF92B00002FFBB828 -:101E50008B0B9C2FFCAA9CEA070003E7260021FAC3 -:101E6000E700080B9AEB2B0000BB1BE06CC0B8EA44 -:101E70001C8001E0A01A9C300CC0282FFC5C6C5820 -:101E80006CC104EA0C001B0E0B2EBBF72A00005895 -:101E90001ACF555804C0241894E76400112ED3A615 -:101EA0008C2FCDE3CF80F8EBCD40F8204D18951660 -:101EB000941297EA0A001C0E0CEA070003F92B00A3 -:101EC00015581B0057D0001302F1EC5604003A00DD -:101ED000008001003B000100009B4F010D02F1EC6E -:101EE00056030000000100C1252EBCF92B00002084 -:101EF0001BB88BE72C0021201CE76C00210B9C58A1 -:101F00001CC0550B9CFE3CFF01AA9CE7260021FA51 -:101F1000E700080B9AEB2B0000BB1BE06CC108EA42 -:101F20001C8001E0A01A56300CC0282FFC5C6C58B5 -:101F30006CC114EA0C001B0E0B2EBBF72A000058D4 -:101F40001ACF555804C0241894E76400112ED3A664 -:101F50008CC0683FFCE76C00112ED3A68C2FCDE31C -:101F6000CF80F880006FE8180BF72A0011580A5E3E -:101F70005DE06A3F20EA1A000074AA2EDBF7290010 -:101F800000F409001A28EA940B2DCC980C580CC0C8 -:101F9000245EFD5C8B5E1D302C5EFCD401F3DAB058 -:101FA00008F5DBB0083FFBC4CFD80AD401F3DAB0A0 -:101FB00008F5DBB0083FFBC8AFD80A584CC0415CFD -:101FC0006B5F0CC028300C5C5C5EFCEBCD40E01815 -:101FD000951497585BC0303046C0283056F7D7B0BC -:101FE00008F9D6B008CEBF00CA58001302F1EC566B -:101FF00004003B00008001003C000100008F6701ED -:102000000D02F1EC56030000000100C0403FFCEB64 -:102010005C0028F3D7B008F5D6B008302B0A9CC274 -:102020002FE3CF80E00000EBCD40E01895149758E7 -:102030005BC0303046C0283056F7D7B008F9D6B06C -:1020400008CCFFC110EB0C0028580CC0A4E06C01B8 -:1020500010EA1C0000980C2D85AA0CE3CF80E03F0D -:10206000FCEB5C0028F3D7B008F5D6B008302B0A9B -:102070009CC3FFE3CF80E0D42118961697EC0700AD -:102080000CF92B0011580BC2F52EDCF9250000E0ED -:102090006C3F20EA1C000078ACF805001C28EC9886 -:1020A00004F7D7B008F9D5B008C9BFC0F05845C18A -:1020B00021089C2C4CE06B00F0F80B0C0A580BC06C -:1020C000A1300C2DA6AC8CDA2A5845C041E044035F -:1020D00084CF805855C041E04426E8CF30ED0C0055 -:1020E00024580CC024D82A5804C221301CED6C009E -:1020F0000FF7D7B008F9D5B008C73FC170ED0C0095 -:1021000028581CC135ED0C0028201C0056DE001399 -:1021100002F1EC5604003C00008001003D0001008B -:1021200000E5DF010D02F1EC56030000000100EDB7 -:102130005C0028ED0C0028580CC0A1F5D7C008F7AA -:10214000D5B008ED2C0000E0A09460D82A302CD83F -:1021500022F7D7B008F9D5B008C55FCD70E06C00A4 -:10216000F0E80C0C0A580BCD11300C2F16AC8C304B -:102170002CD822800165D8EBCD40801897169A0E96 -:102180000A2EDAF52C0000C3EFC0702D878E0C5894 -:102190000CC034E3CF8080E3CF9080EBCD40C018FB -:1021A000971696EE06000A2EDAF52C0000C2BFC084 -:1021B00070EF0C0028580CC034E3CF80C0F7D6B0C5 -:1021C000080E9CC4CEE3CF90C00000D401FE7AFE7E -:1021D00098F95A0024C2FED8020000D401F3DAB004 -:1021E00008303A302BC51ED80A0000D401F3DAB00B -:1021F00008303A302BC8FED80A0000180BF72A0026 -:1022000011580A5E5DE06A3F20EA1A000074AA2EA7 -:10221000DBF7290000F409001A28EA940BE04B00D0 -:102220003CC051300B2DACB88B5EFFE04B0078000A -:10223000D4BA001302F1EC5604003D000080010006 -:102240003E000100007014010D02F1EC5603000085 -:10225000000100C051301B2DACB88B5EFF2DCC9817 -:102260000C580CC0245EFD580B5E1D302C5EFCD457 -:1022700001388AF95A0024FEB0FDF0D8020000D4DB -:1022800001FE7AFED4F95A0024FEB0FDE7D802EB35 -:10229000CD40C018971496F3D6B008300A3FFBFE25 -:1022A000B0FE060C073FFCEF6C00112ED7AE8CE39E -:1022B000CF80C0EBCD40C018971496F3D6B008304D -:1022C0000A3FFBC3AE0C073FFCEF6C00112ED7AEEC -:1022D0008CE3CF80C00000E06C3F20EA1C00007857 -:1022E0004B179B581BC064788C199C580C5F0CC012 -:1022F00028301C5C5C5EFCEBCD40C0E06C3F20EA0B -:102300001C0000788778460F9C580CC0710D9C58B3 -:102310001CC0456CBC781C5D1C0D9C580CC0510F3A -:102320009C580C5F0CC028300C5C5CE3CD80C0D4A2 -:1023300001FEB0FD93E0A01767300BF96B0043F985 -:102340006B00452AECB88BDA0A0000D401FEB0FD20 -:1023500099E0A000D35D001302F1EC5604003E00AA -:10236000008001003F00010000CFAF010D02F1EC41 -:10237000560300000001001759300BF96B0043F9B8 -:102380006B00452AECB88BDA0AD70380006DB0E009 -:102390006C3F20EA1C0000784B179B581BC06478E8 -:1023A0005C199C580C5F0CC028301C5C5C5EFCEB1C -:1023B000CD40C0E06C3F20EA1C0000785778460F03 -:1023C0009C580CC0710D9C581CC0456CBC781C5DA1 -:1023D0001C0D9C580CC0510F9C580C5F0CC0283031 -:1023E0000C5C5CE3CD80C0EBCD40C0E06C3F20EAEC -:1023F0001C0000785778860D9C581CC0440F9C58D0 -:102400001CC0456EBC781C5D1C0D9C580CC0510F47 -:102410009C580C5F0CC028300C5C5CE3CD80C0E0A5 -:102420006C3F20EA1C0000789C199C580C5F0C5EE5 -:10243000FC0000D401E06C3F20EA1C0000780C197D -:102440009B580BC04178BC781C5D1CDA0A0000D494 -:1024500001FEB0FD29E06C3F20EA1C0000780C1959 -:102460009B580BC04178BC782C5D1CDA0A300048C0 -:102470001FD7038001B2500070DC001302F1EC564C -:1024800004003F00008001004000010000CEC701B1 -:102490000D02F1EC56030000000100D7F1C888D707 -:1024A000F1C868D7F1C848D7F1C828D7F1C808D70C -:1024B000F1C7E8D7F1C7C8D7F1C7A8D7F1C788D700 -:1024C000F1C768D7F1C748D7F1C728D7F1C708D7F0 -:1024D000F1C6E8D7F1C6C8D7F1C6A8D7F1C688D7E4 -:1024E000F1C668D7F1C648D7F1C628D7F1C608D7D4 -:1024F000F1C5E8D7F1C5C8D7F1C5A8D7F1C588D7C8 -:10250000F1C568D7F1C548D7F1C528D7F1C508D7B7 -:10251000F1C4E8D7F1C4C8D7F1C4A8D7F1C488D7AB -:10252000F1C468D7F1C448D7F1C428D7F1C408D79B -:10253000F1C3E8D7F1C3C8D7F1C3A8D7F1C388D78F -:10254000F1C368D7F1C348D7F1C328D7F1C308D77F -:10255000F1C2E8D7F1C2C8D7F1C2A8D7F1C288D773 -:10256000F1C268D7F1C248D7F1C228D7F1C208D763 -:10257000F1C1E8D7F1C1C8D7F1C1A8D7F1C188D757 -:10258000F1C168D7F1C148D7F1C128D7F1C108D747 -:10259000F1C0E8D7F1C0C8D7F1C0A800608000132F -:1025A00002F1EC56040040000080010041000100EF -:1025B00000A26B010D02F1EC56030000000100D7F0 -:1025C000F1340A40FBFACCFFC8F01F0007D7F2D65F -:1025D00013E1BA000440FB1A9CF01F0003D7F2D6A7 -:1025E00003000080009A24300CF01F000E580CF8F5 -:1025F0000F1710D603301CF01F000A580CF80F17E5 -:1026000010D603302CF01F0007580CF80F1710D607 -:1026100003303CF01F0003580CF80F1710D603804E -:1026200001AEC0E06A4964EA1A0000740C78797857 -:10263000AB126B1699E2190700C160E21B0300C0E0 -:10264000403FCB951BC0383FEB951B783BAFDB99E8 -:102650003B3FFB99BB999B300CE06B4974EA1B0034 -:1026600000B68CD603EDBB0000C142E06B4974EAB2 -:102670001B0000785A762912CA9729764A201A97A1 -:102680004A764A580AC391301A999A300CB68CD6B9 -:1026900003EDBB0004C0C23EFB99BB3FFB999B30DE -:1026A0000CE06B4974EA1B0000B68CD603EDBB004E -:1026B00001C232E06B4974EA1B0000763958090008 -:1026C00054FA005402F1EC5604004100008001006D -:1026D0004200010003000000003BC081302A999AAB -:1026E000310A998A300CB68CD603761811399718AE -:1026F0009969763C201C973C763C580CC0B1178CED -:10270000580CC080300CB68C743C784A973A783CB0 -:10271000971CD603000052A100DD02F1EC56030025 -:10272000003C00C4D021E0674988EA1700006E3CF5 -:10273000786678950C650C9BE21B70C0C0A0FE6BA0 -:10274000FFFF998B3FFB99AB302C6E2B5D1BC48830 -:102750003084EA140040EBE4000BC0B0FE6BFFFFD6 -:1027600099AB998BEDB50003C042300C6E2B5D1B0D -:10277000EDB50010C1926E3C99A4E07B000099ABCE -:10278000EDB60005C0E2FC1B008099ABE06B70C8A1 -:10279000EA1B0080997B6E1C5D1C6E3B974CC04809 -:1027A000E06B70C9997BEDB50000C0626E3C783C6F -:1027B0005C5CF0170000EDB50017C1226E3CFC1BFD -:1027C0000080EDB60008C072998B99ABE06B0100F8 -:1027D00099ABC06899AB6E1C5D1C6E3B974CD022C8 -:1027E000D6030000E0A02C8A040042000080010013 -:1027F0004300010000044C010D02F1EC56030000FF -:10280000000100D603D70380009C10E0A02D16D64F -:1028100003D70380009D34E0A02C44D603D7038067 -:10282000009B9CE0A02BC6D603D70380009AACC0C7 -:10283000080000D431204D300C503C502CBA0CE034 -:102840006C25B4EA1C00007843E0651B40EA1500E3 -:1028500000EAF609589946EAF70954EB470958EA9D -:10286000FC0950E0A06956189BFC1C447AE0A06764 -:10287000FBEB4C0954EAF40948EAFC0930081CFE59 -:102880003CFF06E06B00FAF80B0D0A5C7B501B4026 -:102890001CE04C004CC054EAFC093C581CC0E13020 -:1028A00006EB5600FAEB5600FC302CE06B25B4EA40 -:1028B0001B0000B60CE08F022DEAFC0944584CC303 -:1028C000D30C9C0E9BE0A068E9C382EAFB09540E7E -:1028D0009CE0A068E3C322EAFC0954E0A07A481413 -:1028E0009016910C9CE0A07A43E068CCCDEA18CC1D -:1028F000CCE069CCCCEA193FFCE0A079B0009802AA -:1029000099E0A00036F4001302F1EC5604004300F5 -:102910000080010044000100009C33010D02F1EC35 -:10292000560300000001007A55C1A2EAFC095430A8 -:102930001BEA1B4040E0A068B7C123EB470954EBFA -:10294000460958E06C25B4EA1C00009943303CE08D -:102950006B25B4EA1B0000B60CE08F0240EAFC09CC -:1029600014EB4C0918EAFC0924EB4C0928401C5CC8 -:102970007CE0A068E11892EAFC0910049BE0A067E3 -:10298000851891EAFC0920049BE0A0677F1893302A -:1029900009EB490914EB49092408973004C2682F50 -:1029A000F75C77E04700FAC0213007EA070026EC21 -:1029B000FC013C029BE0A06631189BE0A066F2EAB5 -:1029C000FB0914E0A06698EB4C0914ECFC05240606 -:1029D0009BE0A06623189BE0A066E4EAFB0924E0E4 -:1029E000A0668AEB4C09242FF45C74401C1834CD8B -:1029F00085EAFC0914049BE0A067481893EB43099F -:102A000014EAFC0924049BE0A067401894EB4409F5 -:102A100024E06C25B4EA1C0000783CE06B25B4EAA5 -:102A20001B0000971CEAFC00342F001302F1EC5647 -:102A300004004400008001004500010000F68B0105 -:102A40000D02F1EC560300000001000A0CEAFB0A3B -:102A500010E0A065F51897E06C25B4EA1C00009919 -:102A600037E0A003FF581CC0713006EB5600FAEBAC -:102A70005600FCC729EAFC0944580CC111EB1C00A4 -:102A8000FCEB1B00FAF60C000A585AC095160CBA5B -:102A90000C3006EB5600FAEB5600FCC0A8EAFC0925 -:102AA00044580CC0603006EB5600FAEB5600FCEAC6 -:102AB000FB09449A8C180BC3D1FC113FE0EAFB09D7 -:102AC00028089CE0A0662AE0A0797630080299E008 -:102AD000A078E93008E069C000EA194062E0A07916 -:102AE0008BC183EAFB0918069CE0A06617E0A07979 -:102AF0006330080299E0A078D63008FC194054E011 -:102B0000A0797AC073FC1B41A00E9CE0A067EAC1CB -:102B100012EB1C00FA2FFCEB5C00FAEAFC0930EB2C -:102B20004C094C306CE06B25B4EA1B0000B60CC1BC -:102B300049EB1700FAEE0C1510C170EAFB092808E2 -:102B40009CE0A066B5FC1B4040E0A0003D94001353 -:102B500002F1EC560400450000800100460001002F -:102B6000006340010D02F1EC560300000001006714 -:102B7000CBC0A25837C0B59A8B0E0BBA0B300CEBFA -:102B80005C00FAC048300CEB5C00FAEAFB09449A9E -:102B90008C180BC2B1EAFC0954FC1B3F80E0A06713 -:102BA000B3C082307CE06B25B4EA1B0000B60CCECB -:102BB00068EAFC0954E06B6667EA1B4016E0A06710 -:102BC00097C143EB1C00FC582CC0D4EB1C00FC2F1D -:102BD000FCEB5C00FC308CE06B25B4EA1B0000B61B -:102BE0000CCCD89A8A180ABA0A3006EB5600FC06B2 -:102BF000980899EAFA0954401B9A8CE0A003AA5855 -:102C00001CC181EAFC0958EB4C0954EAFC0928EB89 -:102C10004C0924E06C25B4EA1C0000781CE06B250C -:102C2000B4EA1B0000973CEAFC0918EB4C0914CAF3 -:102C300068EAFC0954301BEA1B40A0E0A06758C0BA -:102C400053FC1C40A0EB4C0954EB5600FAEB560029 -:102C5000FCEAFC0944580CC1A1EAFB0954EB4B09FE -:102C60005CEB4B0960EAFC0914EB4C091CEAFC0024 -:102C700035B7001302F1EC56040046000080010055 -:102C80004700010000DCFB010D02F1EC56030000DF -:102C90000001000924EB4C092CE06C25B4EA1C006F -:102CA00000783CE06B25B4EA1B0000972CC6B8E026 -:102CB000A002A8581CC261EAFB0954FC1C4000E0B9 -:102CC000A065A61897EB470954301C502CEAFB0965 -:102CD00014FC1C3F00E0A0659B1896EB460914EA23 -:102CE000FB0924FC1C3F00E0A06592EB4C0924EB9F -:102CF000460918EB4C0928EB4709589A8B2FFBBA69 -:102D00000BEAF60954EAFB09580C9CE0A0652AFC82 -:102D10001B3F00E0A0657C1897EB47095CEAFB09C4 -:102D200014EAFC0918E0A0651DFC1B3F00E0A0654B -:102D30006FEB4C091CEAFB0924EAFC0928E0A065BA -:102D400011FC1B3F00E0A06563EB4C092C0C9C0EB2 -:102D50009BE0A066EBC043402C581CC031EB4609F9 -:102D600060E06C25B4EA1C0000781B783CE0A064AD -:102D7000F9FC1B3F00E0A0654BE06B25B4EA1B00AB -:102D800000972C9A8CC81CE0A004268B0CC65CEA29 -:102D9000FC093000ECCD001302F1EC5604004700B2 -:102DA0000080010048000100004B10010D02F1EC11 -:102DB00056030000000100EB4C094C301C503CEB6A -:102DC0004C0A04403C581CC051301CEB5C0028C02D -:102DD00088E06C25B4EA1C0000988CEB5C00289A13 -:102DE0008C8BBCEAFC09508BCC401CEB5C0034EBB8 -:102DF0001C00F6EB5C0036EAFC09148BECEAFC09DB -:102E0000248BFCEAFC0954EB4C0040EAFC091CEB67 -:102E10004C0044EAFC092CEB4C0048EAFC095CEB52 -:102E20004C004CEAFC0930EB4C09483006EB4609F3 -:102E3000503009EB490910EB490920EB46093C6B7E -:102E40007CEB4C0A480A9C2B0C300A300BB91BF85F -:102E5000EB00080A9CFE3CFF34B91B992AEAFC0AE5 -:102E600014EB4C0A18EB490A14402CE06B25B4EA29 -:102E70001B0000977C403C2FCDD832E06C1B40EA11 -:102E80001C0000F8FB0940991BF8FB0964996BF8DA -:102E9000FB0968997BF8FB096C998BF8FB095C9935 -:102EA0002BF8FB09FC999B5EFD0000D431202D1806 -:102EB0009330063005E067004805001302F1EC5638 -:102EC000040048000080010049000100000BAB0134 -:102ED0000D02F1EC560300000001001B40EA170050 -:102EE000005813C225EEFC0940189BF7DBC003EE27 -:102EF0000B002BF6FB0990201CF9DCC003EE0C0044 -:102F00002CF94B0990EEF40944307CE80C0D0AEEE4 -:102F10000B002CF8FC09702014307BE80B0D0AEE36 -:102F20000B002BF74C0970EEF2095CFC1B402004EF -:102F30009CE0A0661FC083EEFC09F8FC1B4040E04B -:102F4000A06618C042303CAE6CC038304CAE6C8EBF -:102F5000ECEEFB0940F7DBC003EE0B002BF74C094E -:102F600090300CC068583BC0212FF52FFC5C7C587A -:102F70008CC094EE0C002BF6FB0990584BCF412FE0 -:102F8000F6CF5B5C765C750C05EA0C161F1805A184 -:102F9000550C35C044304CAE7CC038303CAE7C045F -:102FA00096FC153FC0049C0A9BE0A065E3C0320A72 -:102FB00096C0A8301BEA1B4090049CE0A065CEC0E0 -:102FC00033FC1640900C9CE0A0773E149416950CB0 -:102FD0009CE0A07739E068B8BBEA1800D0C90013BC -:102FE00002F1EC5604004900008001004A00010093 -:102FF000009E60010D02F1EC560300000001000686 -:103000008DE06916F0EA193FB8E0A076A608980AA4 -:1030100099E0A076A2149416950C9CE0A07726E087 -:103020006816F0EA185048E06918FCEA193FE9E030 -:10303000A07693E0681134EA183C36E06952BDEAA4 -:1030400019BFDAE0A0757408980A99E0A0753CE011 -:10305000A0654CEEFB00C4E0A06410E0A07706E0A1 -:1030600068EDB8EA181C22E0691818EA193F78E000 -:10307000A07673E0A0653AEF4C0964EF0B00C858E6 -:103080002BC091E06BC41EEA1B3F7EE0A063F6EF0D -:103090004C0964EEFB0968EEFC0964E0A063981833 -:1030A00090EF400968EEFC09640C9BE0A063E6FC2D -:1030B0001B4270E0A063E21896EF46096CEEF4093B -:1030C00044307CE80C0D0AEE0B002CF946097030F8 -:1030D0000CEF4C098C58743005C262C0C8EE050074 -:1030E0002CF8FC0970029BE0A06372EF4C098C2F56 -:1030F000F55C75EEF1098C0A34CF225C750A9C00F0 -:1031000043CA001302F1EC5604004A00008001009B -:103110004B0001000021DB010D02F1EC5603000021 -:10312000000100E0A06586189B029CE0A0642CEFE3 -:103130004C098CC158EE05002BF6FB0970E0A0632A -:1031400059EF4C098C2FF55C75EEFC098C5875CF46 -:1031500035FC1B40E0E0A06417EF4C098C0C9CE0B0 -:10316000A07696FC15400C8EFC584CC140E0689946 -:103170009AEA189999E0699999EA193FB9E0A07516 -:10318000FE30080A99E0A074E5E0A064C1EF4C0AA3 -:1031900000C138E068999AEA189999E0699999EA22 -:1031A000193FC9E0A075EB30080A99E0A074D2E09D -:1031B000A064AEEF4C0A00049CE0A076693008FCE5 -:1031C00019404EE0A075DB14981699300AFC1B3F9D -:1031D000F0E0A07611BB1BEEFC00C0E0A076581416 -:1031E000941695EEFC0A00E0A07652E068147BEAA3 -:1031F0001847AEE0697AE1EA193F74E0A075BF08AC -:10320000980A99E0A075BBBB08E0A075B8E0A0647F -:103210007F1896EF460A00EEFB09FCE0A062EA1870 -:1032200095EF4500E203001302F1EC5604004B0059 -:10323000008001004C0001000035F3010D02F1ECAB -:103240005603000000010009FCEEFC09402FFCEFD2 -:103250004C0940EEFC09442FFCEF4C0944E60C15E8 -:1032600010C220EEFC0940060CEF4C0940EEFC09B0 -:1032700044060CEF4C0944069CE0A064EDEEFB090B -:1032800064E0A0631F009BE0A062C6EF4C096806E3 -:103290009CE0A064E10C9BE0A063140A9BE0A062A8 -:1032A000BBEF4C09FC2FEDD83AD703800137D08013 -:1032B00001160CEBCD40FC3007E0661B40EA16001F -:1032C00000ECF50954ECFC0960E0A075F3E06866D9 -:1032D00066EA186666E0696666EA193FE6E0A07588 -:1032E00060149216930A9CE0A075E404980699E095 -:1032F000A07600C072ED1C00F6582CC0353017C106 -:1033000078E06B999AEA1B3F990A9CE0A06468C038 -:10331000F26D74301BEA1B4220089CE0A06454C08C -:1033200073FC1B42C8089CE0A0645ACE93ECFC09D5 -:10333000F8FC1B4000E0A06453C0D2301BEA1B40E5 -:10334000000A9CE0A0644000C038001302F1EC5673 -:1033500004004C00008001004D000100005F4B01A3 -:103360000D02F1EC56030000000100C063ED1C00EB -:10337000F6583CC02530070E9CE3CD80FC0000EBE6 -:10338000CD40EC3006E0671B40EA1700008EFC5889 -:103390003CC1E4EEFC0954301BEA1B4000E0A06491 -:1033A00025C163EEFC0914FC1B4120E0A0642AC087 -:1033B000F2EEFC0924FC1B4220E0A06423C0823012 -:1033C0004CE06B25B4EA1B0000B60C3016EEF50994 -:1033D00024FC1B41A00A9CE0A06414C2D3FC133F50 -:1033E000E0EEFB09280A9CE0A06228E0A07574309A -:1033F000080699E0A074E73008FC194044E0A07585 -:103400008BC1A3EEF50914EEFB09180A9CE0A0623B -:1034100015E0A0756130080699E0A074D43008FC6E -:10342000194034E0A07578C073FC1B41200A9CE071 -:10343000A063E8C082305CE06B25B4EA1B0000B6F4 -:103440000C30160C9CE3CD80EC0000EBCD40FE1858 -:103450009516943006E0671B40EA170000EEFC0961 -:103460004418055825C1C3EEFC09540048B80013A0 -:1034700002F1EC5604004D00008001004E000100F6 -:1034800000CA80010D02F1EC56030000000100307B -:103490001BEA1B4060E0A063BBC143EEFC0928EEC1 -:1034A000FB0924E0A062A6301BEA1B40A0E0A06359 -:1034B000AFC083309CE06B25B4EA1B0000B60C3033 -:1034C000165825C1F33013EA134170EEFC0928EEBB -:1034D000FB0924E0A0628E069BE0A06399C123EE65 -:1034E000FC0918EEFB0914E0A06284069BE0A063CF -:1034F0008FC08330ACE06B25B4EA1B0000B60C3003 -:10350000165805C1F0E06525B4EA1500006A2CE004 -:10351000A074F4E0683333EA183333E0693333EAF4 -:10352000193FD3E0A07461149216936A3CE0A07432 -:10353000E504980699E0A07501C04230BCAA0C30A1 -:1035400016EEFC0954301BEA1B4090E0A06360C0FB -:1035500092EEFC095C301BEA1B4080E0A06358C17E -:10356000D3EEFC0924FC1B43C8E0A0635DC0C3EE9E -:10357000FC0914FC1B4316E0A06356C053EF1C006B -:10358000F6582CC0B58EFC583CC08530CCE06B00A2 -:1035900009E7001302F1EC5604004E000080010020 -:1035A0004F00010000753B010D02F1EC56030000D5 -:1035B00000010025B4EA1B0000B60C3016EEFC0931 -:1035C0001CFC1B43C8E0A06341C083EEFC09F8FC6F -:1035D0001B40A0E0A0633AC1A2EEFC0A1CEEFB0A6D -:1035E00020160CE0A075013008FC193FE0E0A07443 -:1035F0000E3018FC194044E0A074B0C08330DCE009 -:103600006B25B4EA1B0000B60C3016089CE0A063E2 -:103610006F189BEEFC00CCE0A061FE1892EF420018 -:10362000D8089CE0A06364189BEEFC00D0E0A06189 -:10363000F31893EF4300DC089CE0A06359189BEE5D -:10364000FC00D4E0A061E81895EF4500E0EEF4003E -:10365000E4089C049BE0A060A71891301BE0A062E6 -:10366000E9C0330294C068049C089BE0A0609C18E9 -:1036700094EEF200E8049C069BE0A060951891305F -:103680001BE0A062D7C0330293C068069C049BE095 -:10369000A0608A1893EEF200EC049C0A9BE0A06004 -:1036A000831891301BE0A062C5C0330295C0680A40 -:1036B0009C049B0080A1001302F1EC5604004F0013 -:1036C0000080010050000100006553010D02F1EC83 -:1036D00056030000000100E0A060781895089C06E1 -:1036E0009BE0A060E10A9BE0A060DEE06B25B4EA0D -:1036F0001B0000976C0E9CFE3CFF28FE37FF1CB998 -:103700000AAF1B782A8F2A0C9CE3CD80FED703805A -:1037100001393280013756EBCD40E03006E0651BC1 -:1037200040EA150000EAFC09405B6CC112E06796B4 -:1037300080EA174B18EAFC09680E9BE0A0628CC077 -:1037400072EAFC09FC0E9BE0A06286C02330160CD6 -:103750009CE3CD80E00000D631201D1694300C5043 -:103760000CE0A004B1E0671B40EA1700003006EF50 -:10377000460A043003EF430A0CEF430A10E06C25BD -:10378000B4EA1C0000B806402CC9BDEEFC09B058D4 -:103790005CC0A1301CEF4C093CEF4609B0EF56006D -:1037A000F2EF5600F4EEFC0950080CEF4C0950EE15 -:1037B000F00930EEFC09481830C041301CEF4C09CC -:1037C0003CEEF20934E405100C0E05402C780CEBAD -:1037D0004C0060402C781C00C9E8001302F1EC5644 -:1037E0000400500000800100510001000071EE0152 -:1037F0000D02F1EC56030000000100EB4C006440A8 -:103800002C782CEB4C0068F7D4C010402CE0A002C0 -:103810000D8F4C6BAC6B946B85189BE0A060AC1863 -:1038200091089C089BE0A060A718940A9C0A9BE062 -:10383000A060A2089BE0A06049029BE0A06046E077 -:10384000A07392E0A0A292E0A061CE1895EEFC09D0 -:1038500038580CC121300CC068EE0C002BF7450124 -:10386000002FFC5C7C587CCF95FC1B40E00A9CE060 -:10387000A06082EF4C0138EE020021E2FB01000A59 -:103880009CE0A05FB5EEFB0138E0A0601F1894EF4C -:10389000440138E3450100EE000022E544013CEE1E -:1038A000FB0910E0A06012EF4C0910E2FB011C08BC -:1038B0009CE0A05F9D1895E5450524E344011CEEBE -:1038C000FB0920E0A06002EF4C09200E9CFE3CFFAB -:1038D0004C4029B30BB92A130A18AAEF1C00F02F89 -:1038E000FCEF5C00F0EEFC09B0581CC030583CC343 -:1038F000A1EF1C00F0582CC2748EFB00B2350013EF -:1039000002F1EC5604005100008001005200010059 -:1039100000E425010D02F1EC5603000000010058FF -:103920004BC244EEFC0944580CC761EEF2090C305E -:1039300014EA1440E0049C089BE0A061BDC0620A48 -:103940009C089BE0A061ACC0D2FC14C0E0049C08C1 -:103950009BE0A061A5C6030A9C089BE0A061ACC5E2 -:10396000B2301CEF4C093CC578E04C0027C0D5EFC5 -:103970001B00F2F60A1510C050160CE04C004BC0AC -:1039800045301CEF4C093C0A9BEEFC090CE0A00200 -:1039900079EEFC09B0581CC3F1EF1C00F2F80B15CE -:1039A00010C3A0EF1B00F4F60A1510C350303A16EE -:1039B0000CE04C003DC045301CEF4C093C8EFC58DF -:1039C0004CC025302AEF1C00F6F80A1900C042301E -:1039D0001CEF4C093CEEFC0A1CEF4C0A20EEFB0AE3 -:1039E00024EEFC0A28180BEEFC0A2C180BEF4B0AED -:1039F0001CEF460A2CEF460A28EF460A24FEB0F8D0 -:103A000029500CEF5600F4EF5600F6E06C25B4EAAE -:103A10001C00009956EEFB0930EEFC094C181B0007 -:103A2000C92E001302F1EC56040052000080010080 -:103A300053000100005B9E010D02F1EC56030000F3 -:103A4000000100FE3BFF06E06C00FAF60C0D0AE0F8 -:103A50004B0096C111EF460944EF43095CEF43095F -:103A60008C8F838F23AE66EF5600FAEF5600FC3042 -:103A70001CEF4C0A04E04B0064C1818F838F230E3E -:103A80009CFE3CF670300A300BB91BF8EB0008F8CE -:103A9000EB0010F8EB0018AE768F23301CEF4C0AC9 -:103AA00004EF5600FAEF5600FCEEFC0930EE0C0075 -:103AB0002CF8FC0524EF4C090CEEFC09302FFCEF30 -:103AC0004C0930EEFC0930E04C00FAC031EF4609F9 -:103AD00030EEFC09342FFCEF4C0934EEFC0934586D -:103AE0007CC031EF460934EEFC09382FFCEF4C095D -:103AF00038EEFC0A04580CC120EF470A080E9BFE62 -:103B00003BF5B40E9C169E305AB909BD28201ACF39 -:103B1000D10E9CFE3CF5B4EF4C0A08400C2FFDDCA6 -:103B200032D7038001966C800114E8EBCD40F81881 -:103B300095E0671B40EA170000EEF60A30EEF4004D -:103B4000B40C9C0047E2001302F1EC560400530051 -:103B50000080010054000100004FB6010D02F1EC9D -:103B600056030000000100E0A0611C18936A0C08D5 -:103B70009BE0A05E73069BE0A05F34300BE0A0608A -:103B8000BFC202EEFB0A3C089CE0A05E67E0A072A8 -:103B900021BFDBE068999BEA189999E0699999EA55 -:103BA000193FC9E0A07234C063EEFC0A242FFCEF79 -:103BB0004C0A24EEFC00B4EF4C0A3C5C36EF460A9B -:103BC00030EEF60A34EEF400B80C9CE0A060EA187F -:103BD000936A1C089BE0A05E41069BE0A05F023058 -:103BE0000BE0A0608DC202EEFB0A40089CE0A05EE4 -:103BF00035E0A071EFBFDBE068999BEA189999E086 -:103C0000699999EA193FC9E0A07202C063EEFC0A03 -:103C1000282FFCEF4C0A28EEFC00B8EF4C0A405C61 -:103C200036EF460A34EEF60A38EEF400BC0C9CE09F -:103C3000A060B818936A2C089BE0A05E0F069BE07A -:103C4000A05ED0300BE0A0605BC202EEFB0A44082D -:103C50009CE0A05E03E0A071BDBFDBE068999BEA39 -:103C6000189999E0699999009C1E001302F1EC568D -:103C700004005400008001005500010000250E01E1 -:103C80000D02F1EC56030000000100EA193FC9E003 -:103C9000A071D0C063EEFC0A2C2FFCEF4C0A2CEE76 -:103CA000FC00BCEF4C0A445C36EF460A38E3CF8098 -:103CB000F8D70380011638D531201D1896E0651B12 -:103CC00040EA1500006C0CEAFB00B4E0A05DD8509F -:103CD0000C6C1CEAFB00B8E0A05DD218906C2CEADA -:103CE000FB00BCE0A05DCC1891400BBFDB009CBF8B -:103CF000DC0297BFD7E0A05E310E9BE0A05E2E18DD -:103D000097400CBFDC6B4BE0A05E28EB4C005000F2 -:103D10009CBFDC6B5BE0A05E21EB4C0054029CBFBF -:103D2000DC6B6BE0A05E1AEB4C00586B7B0E9CE0EA -:103D3000A05E14EB4C005CEAFB00CC6C0CE0A05ED7 -:103D40000DEB4C00CCEAFB00D06C1CE0A05E06EB57 -:103D50004C00D0EAFC00D46C2BE0A05DFFEB4C00E3 -:103D6000D4EAFC0938580CC121300CC068EA0C00B8 -:103D70002BF74709B42FFC5C7C58FCCF95FC1B410A -:103D8000700E9CE0A05E40EB4C09F000AF73001396 -:103D900002F1EC56040055000080010056000100BD -:103DA00000B0C5010D02F1EC56030000000100EB6C -:103DB0001C00F8EA0C0026ECFB09B40E9CE0A05DA8 -:103DC00071EAFB09F0E0A05DDBEB4C09F0ED47097F -:103DD000B4FC1B4170E0A05E9D1893EB4309F8E032 -:103DE0006425DCEA140000681B009CE0A05E1E183D -:103DF00097680B400CE0A05E191896300BE0A05FAE -:103E0000A3C0E3300B0E9CE0A05F9EC093682B0222 -:103E10009CE0A05E0B300BE0A05F96C4D2682B0242 -:103E20009CE0A05E0318920C9C0E9BE0A05F8CC0EF -:103E3000A20C9C049BE0A05F87C0320C9CC098043D -:103E40009CC0780E9C049BE0A05F7ECFA20E9C30AD -:103E50001BE0A05F6D0C9C0E9BC133E0A05F74C0A3 -:103E6000A20C9C049BE0A05F6FC0320C97C1C804F9 -:103E700097C1A80E9C049BE0A05F66CFA2C148E05A -:103E8000A05F62C0A20C9C049BE0A05F5DC0320CEE -:103E900097C0880497C0680E9C049BE0A05F54CF35 -:103EA000A2EE178000EAFC0A140E9BE0A05F4C0013 -:103EB0003E6D001302F1EC56040056000080010034 -:103EC00057000100000F7E010D02F1EC56030000C7 -:103ED000000100C032EB470A14400C890C8910899C -:103EE00021FC1B3E80069CE0A05F40C0829ADCEA79 -:103EF000FB09F4180BEB4B09F4C048300CEB4C09F0 -:103F0000F4EB1C00F82FFCEB5C00F8EB1C00F858FD -:103F1000FCC041300CEB5C00F8EAFC09F42FFDD941 -:103F200032D703800110F0800111CC800113608032 -:103F3000011278EBCD40FC189616953004E0671B13 -:103F400040EA1700008EFC584CC035FC144000308D -:103F50000B0C9CE0A05EFEC0B3300B0A9CE0A05F9F -:103F600005C062EF1C00F62FFCEF5C00F6EEFC09CA -:103F7000B0580CC0A0581CC650582CE08000AF5858 -:103F80003CE08000D3C0B9089CE0A070593008FC28 -:103F900019401CE0A06EB6149216930C9CE0A07021 -:103FA0004F14981699049A069BE0A07067C2730A92 -:103FB0009CE0A0704514981699049A069BE0A070A6 -:103FC0005FC1D2EF1C00F0590CC043300CEF5C0015 -:103FD000F0301C00A2F5001302F1EC56040057006B -:103FE0000080010058000100009895010D02F1ECDD -:103FF00056030000000100EF4C09B0E06325B4EA6D -:10400000130000668CEF4C0A0C669CEF4C0A10EE15 -:10401000FC0930EE0C002CF8FC0524878CCD18EE42 -:10402000FC0930EE0C002CF8F20524E06325B4EA1C -:10403000130000669B049CE0A05EAAC02287923019 -:104040000B0C9CE0A05E98E08300BC300B0A9CE067 -:10405000A05E9EE08200B6301CE06B25B4EA1B0037 -:1040600000975CCAE8EEFC0930EE0C002CF8F20573 -:1040700024E06325B4EA130000668C049BE0A05E94 -:1040800087C0228782FC133F800C9C069BE0A05EC9 -:1040900073E08300970A9C069BE0A05E79E08200B3 -:1040A00091EF1C00F0EF5C00F2300CEF5C00F008C8 -:1040B0009CE0A06FD714981699300AFC1BC01CE036 -:1040C000A06DFE149216930A9CE0A06FCB04980694 -:1040D00099E0A06FE7C102303CEF4C09B0EEFC095B -:1040E00030EE0C002CF8FC0524E06B25B4EA1B0034 -:1040F00000979CC668302C00ADCC001302F1EC5642 -:1041000004005800008001005900010000D82E0171 -:104110000D02F1EC56030000000100EF4C09B0C69F -:1041200028089CE0A06FB014981699300AFC1BC0B8 -:104130001CE0A06DD7149216930C9CE0A06FA40411 -:10414000980699E0A06FBEC0930A9CE0A06F9C0403 -:10415000980699E0A06FB8CD23301B0C9CE0A05EC0 -:1041600029C412301B0A9CE0A05E18C3C3C87BEEB2 -:10417000FC0930EE0C002CF8F20524E06325B4EACB -:10418000130000669B049CE0A05E14C0228792E0AE -:1041900063FFFEEA13BF7F0C9C069BE0A05E0AC291 -:1041A000220A9C069BE0A05DF9C1D3EF1C00F0EF52 -:1041B0005C00F43006EF5600F00A9CE0A06F641437 -:1041C000921693089CE0A06F5F3008FC19401CE039 -:1041D000A06DBC04980699E0A06F76FE93FF1FEFD8 -:1041E0004609B0EEFC09B0E3CD80FC800134C48008 -:1041F0000138A4800115948001157C800138688005 -:1042000001352C800138A8E06C1B40EA1C0000F846 -:10421000FC09B05EFC0000EBCD40E000D6F80013D6 -:1042200002F1EC5604005900008001005A00010020 -:10423000004DE5010D02F1EC5603000000010020E5 -:104240001D3007E06CC308EA1C80011A9B198AB66E -:104250008A199AB69A19ACBAACE06600D43018FA4A -:10426000C9FFFE30FAF7D6C008301CE0A00B5C1B7B -:10427000ACE04C00D4C0E1320CBA8C35FCBA9C30B6 -:10428000291A9AF7D6C008301CE0A00B211897C055 -:10429000510E9C2FFDE3CD80E0321CBA8C310CBA5C -:1042A0009C30291A9AF7D6C008301CE0A00B1018D1 -:1042B00097CF00322CBA8C3005BA9530291A9AF76C -:1042C000D6C008301CE0A00B031897CE30323CBAA1 -:1042D0008CE06C008CEA1C0000198CA7BCBA9C30E6 -:1042E000291A9AF7D6C008301CE0A00AF11897CD19 -:1042F00010324CBA8C312CBA9C30291A9AF7D6C09D -:1043000008301CE0A00AE41897CC40320CBA8CBAF2 -:104310009530291A9AF7D6C008301CE0A00AD818A0 -:1043200097CB8BEBCD4080201D1A9C300BB88BB8FF -:104330009B320CBA8C35FCBA9CE06700D430290063 -:104340009420001302F1EC5604005A000080010092 -:104350005B00010000F25E010D02F1EC560300006B -:104360000001001A9AF7D7C008301CE0A00AC2C0AA -:10437000412FFDE3CD8080321CBA8C310CBA9C30C9 -:10438000291A9AF7D7C008301CE0A00AB3CF203210 -:104390002CBA8C300CBA9C30291A9AF7D7C0083046 -:1043A0001CE0A00AA7CE60323CBA8CE06C008CEA1C -:1043B0001C0000198CA7BCBA9C30291A9AF7D7C0E8 -:1043C00008301CE0A00A96CD50324CBA8C312CBA81 -:1043D0009C30291A9AF7D7C008301CE0A00A8ACC72 -:1043E0009B0000D401201D1A9C300BB88BB89B3267 -:1043F0000CBA8C300CBA9C30291A9AE06B00D4307D -:104400001CE0A00A772FFDD8020000D401201D1A5D -:104410009C300BB88BB89B320CBA8C300CBA9C30E9 -:10442000291A9AE06B00D4301CE0A00A632FFDD853 -:10443000020000EBCD40F8201D18931694E067C1F0 -:10444000E0EA1780011A9C0F8BB88B0F9BB89B304A -:1044500056E06500D430181A99327AF7D5C0083082 -:104460001CE0A000ED2B001302F1EC5604005B00F1 -:10447000008001005C00010000E676010D02F1EC15 -:10448000560300000001000A73581CC1611B8CED2B -:10449000BC0003C122F1D4C0080699E06A00A8F765 -:1044A000D5C008301CE0A00A63C0E12FC70E9CE015 -:1044B000A009E0300CC0980C9CFE3600015C7CCD5D -:1044C000B1300CC028301C2FFDE3CD80F8D703801D -:1044D000006FE8EBCD40C0201D1A9C300BB88BB8A4 -:1044E0009B320CBA8C36FCBA9CE06700D430291A97 -:1044F0009AF7D7C008301CE0A00A0EC0412FFDE398 -:10450000CD80C0321CBA8C3006BA9630291A9AF780 -:10451000D7C008301CE0A009FFCF20322CBA8CBADB -:104520009630291A9AF7D7C008301CE0A009F4CEBB -:1045300070323CBA8CE06C008CEA1C0000198CA72D -:10454000BCBA9C30291A9AF7D7C008301CE0A009E1 -:10455000E3CD60324CBA8C340CBA9C30291A9AF7ED -:10456000D7C008301CE0A009D7CCABEBCD5EFF2351 -:10457000ADE06BBA38EA1B80011A9C178AB88A171B -:104580009AB89AFACAFFF4000CD3001302F1EC5661 -:1045900004005C00008001005D000100008CCE0181 -:1045A0000D02F1EC56030000000100169C2FEC19DF -:1045B00089B4891999B499FACAFFD8169C2FCCE00E -:1045C0006E00C0B909B528208ECFD1300CBAACF638 -:1045D000E800C4FAE90004F6E800CCFAE90010FAB1 -:1045E000CCFFE4FE3BFF2CB709B928170818A8E058 -:1045F000A00836506CC81FE06B0320406CE0A00B95 -:1046000017C138301CBAAC300C507C5081509143EB -:10461000CC980CFB5C001043CC981CFB5C00124354 -:10462000CC982CFB5C001432ECBA8C3001BA91E0CF -:104630006700D430291A9AF7D7C008301CE0A009C7 -:104640007D1892C041049C5C6CC1A932ECBA8C33D9 -:10465000FCBA9C30291A9AF7D7C008301CE0A00990 -:104660006D1892CF10E06B00C8406CE0A00AE030FB -:1046700018FAC9FFF432FAF7D7C008301CE0A009D5 -:10468000891892CE10FB3C000CEDBC0007C0333003 -:104690000CCF68E06800C0FAC9FFD8E06A00A8F74C -:1046A000D7C008301CE0A00975189200CD80001317 -:1046B00002F1EC5604005D00008001005E00010084 -:1046C000001905010D02F1EC56030000000100CCB9 -:1046D000D030033000C0282FA0E06451ECEA141E53 -:1046E000B8E065EB85EA153F91E04000C0C5E4FA0B -:1046F000CBFFD8000B179A178CF9EA108ABA2A1741 -:10470000BA17ACF9EA108ABA3A17DA17CCF9EA10F4 -:104710008ABA4A2FF343ECB8039A2CE0A05BF6E088 -:10472000A06D0C08980A99E0A06C7FE0A06D514341 -:10473000EBB61C9A360C9CE0A05BE8E0A06CFE088F -:10474000980A99E0A06C71E0A06D4343EBB62C9AF7 -:10475000470E9CE0A05BDAE0A06CF0149816990874 -:104760009A0A9BE0A06C61E0A06D3343EBB63C9AE3 -:104770002C407A180A507A408B0C0B508B409B0EC1 -:104780000B509B300CC0282FFC583CCA64FACBFF5E -:10479000FCF60C041BFE3BF060E04B1F41CF533096 -:1047A0001C43BBB68C300CC7D89A2CE0A05BAEE0A3 -:1047B000A06CC408980A99E0A06C37E0A06D09438A -:1047C000CBB60C9A3CE0A05BA1E0A06CB7089800C7 -:1047D0002F7D001302F1EC5604005E000080010002 -:1047E0005F00010000A6BE010D02F1EC56030000BF -:1047F0000001000A99E0A06C2AE0A06CFC43CBB653 -:104800001C9A4CE0A05B94E0A06CAA08980A99E07E -:10481000A06C1DE0A06CEF43CBB62C1BAC581CFE6B -:1048200091FF16FB0B001043CC980C181BFB5B0090 -:1048300010FB0B001243CC981C162CFB5C0012FBE7 -:104840000A001443CB962B142BFB5B0014FB0A00CD -:10485000102FCA589AC3525C8C2FCC589CC3125C40 -:104860008B2FCB589BC2D2FC173FA0407CE0A05BB3 -:104870005FE0A06C7530080E99E0A06BE8E0A06CDA -:10488000BA43DBB60C408CE0A05B52E0A06C683011 -:10489000080E99E0A06BDBE0A06CAD43DBB61C40DA -:1048A0009CE0A05B45E0A06C5B30080E99E0A06B3B -:1048B000CEE0A06CA043DBB62C301C43BBB68CA171 -:1048C000A2049C5C6C2C6DE3CDCEFFEBCD40C020F0 -:1048D0001D1A9C300BB88BB89B320CBA8C36FCBAC4 -:1048E0009CE06700D430291A9AF7D7C008301CE042 -:1048F000A008480043A8001302F1EC5604005F0032 -:1049000000800100600001000039D5010D02F1ECCA -:1049100056030000000100C3B0321CBA8C3006BA46 -:104920009630291A9AF7D7C008301CE0A0083CC27C -:10493000F0322CBA8CBA9630291A9AF7D7C00830C0 -:104940001CE0A00831C240323CBA8CE06C00A0BA36 -:104950009C30291A9AF7D7C008301CE0A00824C15F -:1049600070324CBA8C302CBA9C30291A9AF7D7C0C6 -:1049700008301CE0A00818C0B032ECBA8CBA9630EF -:10498000291A9AF7D7C008301CE0A0080D2FFDE3C4 -:10499000CD80C0D431209D189016913007E06CBFB7 -:1049A000ACEA1C80011A9B198AB68A199AB69AF841 -:1049B000EA0004FAEB0010F8EA000CFAEB001C30F5 -:1049C000032ECCB90AFAEB000830043006300CBADA -:1049D000AC506C30323035E0A00678501CC05830F6 -:1049E0005B401CE0A0095A049CFE32FF015C5CC0E5 -:1049F00050C7FF18975817CF415817C0C030BC8117 -:104A00000C811C812C830C831C832C0E9C5C6CE021 -:104A10008F022BE06B032000D56C001302F1EC56E3 -:104A20000400600000800100610001000085640155 -:104A30000D02F1EC56030000000100401CE0A0094B -:104A40003FC068305B401CE0A0093A2FF65C665816 -:104A5000A6C10430181A99327AE06B00D4301CE0F9 -:104A6000A007E01B8CE21C0008BA8C1B8C580CCEF3 -:104A7000A00A9CFE35FF015C5CC1303068FAC9FFBA -:104A8000F0E06A00A8E06B00D4301CE0A007CA1870 -:104A9000975817C060305B401CE0A00911CEABFAFC -:104AA000CCFFF0300A300BB91BC278FB3B0011FB86 -:104AB0003C0010F9EB108BBA4BFB3B0013FB3C00A6 -:104AC00012F9EB108BBA5BFB3B0015FB3C0014F9B1 -:104AD000EB108BBA6BFB2B00022FFBBAAB9A4C602E -:104AE0000B180B810B9A5C601B180B811B9A6C6076 -:104AF0002B180B812B2FF45C645854C4D43006C09F -:104B000078305B401CE0A008DB2FF32FF65C665882 -:104B1000A6C10430181A99327AE06B00D4301CE038 -:104B2000A007801B8CE21C0008BA8C1B8C580CCE92 -:104B3000905C5358A3C0C1E06C00CC009C130013E0 -:104B400002F1EC56040061000080010062000100E7 -:104B50000010AF010D02F1EC5603000000010081CE -:104B60000C811C812C830C831C832C0E9C5C6CC9D7 -:104B7000F93035C058305B401CE0A008B30A9CFEF9 -:104B800035FF015C5CC0E03068FAC9FFF0E06A0004 -:104B9000A8E06B00D4301CE0A0075618975817CE39 -:104BA000B15817C960316C810C811C812C830C8336 -:104BB0001C832C0E9C5C6CC7B9FB2B0002581B306D -:104BC00004C2655C645834C264E0040027FB2C0016 -:104BD00002E0A059E318966E0CE0A059DF0C9BE0B0 -:104BE000A05870E0A06AF2E06851ECEA181EB8E044 -:104BF00069EB85EA193FB1E0A06A5FE0A06B318FF5 -:104C00000C2FF4CE0B300CE004092C2FF45C64580C -:104C100034CFA5300CBAAC323CFB6C001CE06C000D -:104C2000A2FB6C001DE06200D43029FACAFFE4F751 -:104C3000D2C008301CE0A006DB18975817C0B0326D -:104C40001C810C811C812C830C831C832C0E9C5C8E -:104C50006CC2E9364B401CE0A008443006C0680036 -:104C60004578001302F1EC56040062000080010058 -:104C70006300010000AF14010D02F1EC56030000C7 -:104C8000000100305B401CE0A0083E2FF65C665837 -:104C9000A6C10430181A99327AF7D2C008301CE045 -:104CA000A006E41B8CE21C0008BA8C1B8C580CCEAE -:104CB000A03035C058305B401CE0A008250A9CFE9F -:104CC00035FF015C5CC0E03068FAC9FFF0E06A00C3 -:104CD000A8F7D2C008301CE0A006C818975817CE15 -:104CE000B15817C0B032CC810C811C812C830C834D -:104CF0001C832C0E9C5C6CCED8FACCFFF0300A30B2 -:104D00000BB91B30033004C368FB3B0011FB3C00B4 -:104D100010F9EB108BBA4BFB3B0013FB3C0012F974 -:104D2000EB108BBA5BFB3B0015FB3C0014F9EB105E -:104D30008BBA6B9A4C5C4CE04C0065C1B59A5C9A9E -:104D40005B5C4BE04B0065C1559A6B9A6A5C4AE02C -:104D50004A0065C0F5FB2900022FF9BAA99A4A62F8 -:104D60000914098309621A180A831A622C160C8323 -:104D70002C2FF45C645854C4D43006C078305B40A7 -:104D80001CE0A000621A001302F1EC56040063005C -:104D9000008001006400010000BB3C010D02F1EC49 -:104DA0005603000000010007C12FF32FF65C665880 -:104DB000A6C10430181A99327AF7D2C008301CE024 -:104DC000A006661B8CE21C0008BA8C1B8C580CCE0B -:104DD000905C5358A3C0C1E06C00DD810C811C8144 -:104DE0002C830C831C832C0E9C5C6CC8583035C003 -:104DF00058305B401CE0A007990A9CFE35FF015C1F -:104E00005CC0E03068FAC9FFF0E06A00A8F7D2C0E1 -:104E100008301CE0A0063C18975817CEB15817C8A8 -:104E200070337C810C811C812C830C831C832C0EA1 -:104E30009C5C6CC618FB2B0002581B3004C2655CDE -:104E4000645834C264E2040027FB2C0002E0A0583E -:104E5000C918966E0CE0A058C50C9BE0A05756E010 -:104E6000A069D8E06851ECEA181EB8E069EB85EA61 -:104E7000193FB1E0A06945E0A06A178F0C2FF4CE6E -:104E80000B300CE204092C2FF45C645834CFA5627B -:104E90000C600B163CC055620B600C162CC04860B1 -:104EA0000B620C162C621B001F5C001302F1EC5607 -:104EB00004006400008001006500010000D184014D -:104EC0000D02F1EC56030000000100601A143BC013 -:104ED00055621A601B142BC048601A621B142B62A7 -:104EE0002A6029123AC0556229602A122AC04860F5 -:104EF00029622A122AFE79FF51120CE04C02BDC031 -:104F0000B2120BE04B02BDC072120AE04A02BDC0F1 -:104F100032301C506C406C5C6C2F7DD832D70380D3 -:104F2000006DB080007380800116388001136080AE -:104F300001386880013756800138FED401198B583A -:104F40000BC031C56CD802198B581BC031C05CD85E -:104F500002C17CD8020000EBCD40C01897E0661279 -:104F60008CEA16000030180C99326AE06B00D430DD -:104F70001CE0A0059F0D8BAE8BE3CD80C00000EB45 -:104F8000CD4080201D18971A9C300BB88BB89B0F12 -:104F90008CE21C00F0210CC040230CC100C0883002 -:104FA0000CE06B008CEA1B0000B68CC0E8310CE012 -:104FB0006B008CEA1B0000B68CC078320CE06B00F2 -:104FC0008CEA1B0000B68C323CBA8C009BE00013CC -:104FD00002F1EC560400650000800100660001004B -:104FE00000444F010D02F1EC56030000000100E007 -:104FF0006C008CEA1C0000198CA7BCBA9C30291AE2 -:105000009AE06B00D4301CE0A0053AAE8C2FFDE393 -:10501000CD8080EBCD40F8219D18973006E06BBB2A -:10502000ACEA1B8001B708FAE9005C300CFB6C00AD -:1050300040F6E80008FAE90010F6E80010FAE90086 -:1050400008F6E80018BB19FACAFFB0169C2E0CB976 -:1050500009B528190814A8FACAFFBC169C2D4CB92A -:1050600009B528190814A8F6E80038FAE90038F656 -:10507000E80040FAE90030F6E80048FAE90028F6CE -:10508000E80050FAE900202A8BB70AFAEB0018E092 -:105090006300D4E0651290EA15000030180A992FD9 -:1050A0004930FAF7D3C008301CE0A00515EB3C00EE -:1050B0000CE04C00D4C0D13058FAC9FFA4E06A001B -:1050C000A0F7D3C008301CE0A005061896C0510C0C -:1050D0009C2E7DE3CD80F81A99FACAFFF8FACBFF2F -:1050E000F0FACCFFC0FEB0FAF7EB6C000FFACB0081 -:1050F000ADC1001302F1EC5604006600008001000F -:105100006700010000FBF4010D02F1EC5603000002 -:10511000000100FFBCFACCFFB0FEB0FCBBEB6C00A2 -:105120000E3004C138320CAA8CFACCFFA4080C193A -:105130008CAA9C30290A9AF7D3C008301CE0A0043E -:10514000B11896CD802FF45C545854CED5E0A0A66B -:105150005D281C198C588CF9BC02082FECFE0C0041 -:105160001FC098C398C6E8CA88CDD8C179C4C9C839 -:1051700069CC49414CFB5C0038415CFB5C003A4126 -:105180006CFB5C003C411CFB5C0030412CFB5C0078 -:1051900032413CFB5C0034FB0C0010FB5C0020FB4C -:1051A0000C0012FB5C0022FB0C0014FB5C00249A38 -:1051B0001CFB5C00189A2CFB5C001A9A3CFB5C0000 -:1051C0001C9A4CFB5C00289A5CFB5C002A9A6CFBE6 -:1051D0005C002CC939415CFB5C0038414C5C3CFBF9 -:1051E0005C003A416CFB5C003C412CFB5C003041B4 -:1051F0001C5C3CFB5C0032413CFB5C0034FB0C0063 -:1052000012FB5C0020FB0C00105C3CFB5C0022FBF2 -:105210000C00140080D5001302F1EC560400670066 -:105220000080010068000100006C1F010D02F1EC1C -:1052300056030000000100FB5C00249A2CFB5C007C -:10524000189A1C5C3CFB5C001A9A3CFB5C001C9AA4 -:105250005CFB5C00289A4C5C3CFB5C002A9A6CFB73 -:105260005C002CC5D9414C5C3CFB5C0038415C5C6B -:105270003CFB5C003A416CFB5C003C411C5C3CFB31 -:105280005C0030412C5C3CFB5C0032413CFB5C0030 -:1052900034FB0C00105C3CFB5C0020FB0C00125C3F -:1052A0003CFB5C0022FB0C0014FB5C00249A1C5CA1 -:1052B0003CFB5C00189A2C5C3CFB5C001A9A3CFBA3 -:1052C0005C001C9A4C5C3CFB5C00289A5C5C3CFBE0 -:1052D0005C002A9A6CFB5C002CC229415C5C3CFBA4 -:1052E0005C0038414CFB5C003A416CFB5C003C418B -:1052F0002C5C3CFB5C0030411CFB5C0032413CFB05 -:105300005C0034FB0C00125C3CFB5C0020FB0C00DE -:1053100010FB5C0022FB0C0014FB5C00249A2C5C4C -:105320003CFB5C00189A1CFB5C001A9A3CFB5C007E -:105330001C9A5C5C3CFB5C00FC84001302F1EC56A4 -:10534000040068000080010069000100002CA40135 -:105350000D02F1EC5603000000010000289A4CFBFE -:105360005C002A9A6CFB5C002CCEC8414C5C3CFB78 -:105370005C0038415CFB5C003A416C5C3CFB5C00CF -:105380003C411C5C3CFB5C0030412CFB5C0032412E -:105390003C5C3CFB5C0034FB0C00105C3CFB5C00A8 -:1053A00020FB0C0012FB5C0022FB0C00145C3CFB9D -:1053B0005C00249A1C5C3CFB5C00189A2CFB5C0093 -:1053C0001A9A3C5C3CFB5C001C9A4C5C3CFB5C000D -:1053D000289A5CFB5C002A9A6C5C3CFB5C002CCB42 -:1053E00018415CFB5C0038414CFB5C003A416C5C52 -:1053F0003CFB5C003C412CFB5C0030411CFB5C0036 -:1054000032413C5C3CFB5C0034FB0C0012FB5C005A -:1054100020FB0C0010FB5C0022FB0C00145C3CFB2E -:105420005C00249A2CFB5C00189A1CFB5C001A9A06 -:105430003C5C3CFB5C001C9A5CFB5C00289A4CFBCF -:105440005C002A9A6C5C3CFB5C002CC7B8414CFBAE -:105450005C0038415C5C3CFB5C003A0093BF00138D -:1054600002F1EC5604006900008001006A000100AE -:1054700000B96F010D02F1EC56030000000100417C -:105480006C5C3CFB5C003C411CFB5C0030412C5CD8 -:105490003CFB5C0032413C5C3CFB5C0034FB0C00A0 -:1054A00010FB5C0020FB0C00125C3CFB5C0022FB50 -:1054B0000C00145C3CFB5C00249A1CFB5C00189AFA -:1054C0002C5C3CFB5C001A9A3C5C3CFB5C001C9A2C -:1054D0004CFB5C00289A5C5C3CFB5C002A9A6C5C90 -:1054E0003CFB5C002CC408415C5C3CFB5C0038412C -:1054F0004C5C3CFB5C003A416C5C3CFB5C003C411E -:105500002C5C3CFB5C0030411C5C3CFB5C00324191 -:105510003C5C3CFB5C0034FB0C00125C3CFB5C0024 -:1055200020FB0C00105C3CFB5C0022FB0C00145CBC -:105530003CFB5C00249A2C5C3CFB5C00189A1C5CD5 -:105540003CFB5C001A9A3C5C3CFB5C001C9A5C5C7B -:105550003CFB5C00289A4C5C3CFB5C002A9A6C5C2F -:105560003CFB5C002C3004C2E8E80B1502E80C158B -:1055700001FACAFFC8180A940AFAC9FFB01609004E -:105580001D45001302F1EC5604006A000080010082 -:105590006B0001000006D4010D02F1EC560300007F -:1055A000000100930AFACAFFD0180A940AFAC9FF48 -:1055B000BCF20B090AFACBFFD8180B960BFACAFFFC -:1055C000F8180AB40BFACBFFE0180B960BFACAFFD7 -:1055D000F0180AB40BFACBFFE8180B960B1A9A14C2 -:1055E0000CB81B2FF45C545834CD25414CA94CAE5B -:1055F0008C414CAE9C415CA94CAEAC415CAEBC4114 -:105600006CA94CAECC416CAEDC411CA94CAEEC415B -:105610001CAEFC412CA94CEF6C0008412CEF6C0037 -:1056200009413CA94CEF6C000A413CEF6C000B9A1D -:105630004CA94CEF6C000C9A4CEF6C000D9A5CA9D5 -:105640004CEF6C000E9A5CEF6C000F9A6CA94CEF5B -:105650006C00109A6CEF6C0011FB0C0010A94CEF61 -:105660006C0012FB0C0010EF6C0013FB0C0012A975 -:105670004CEF6C0014FB0C0012EF6C0015FB0C00DF -:1056800014A94CEF6C0016FB0C0014EF6C00179A79 -:105690000CEF6C00189A1CA94CEF6C00199A1CEFC7 -:1056A0006C001A003C88001302F1EC5604006B00F9 -:1056B000008001006C0001000012FC010D02F1EC01 -:1056C000560300000001009A2CA94CEF6C001B9AB5 -:1056D0002CEF6C001C9A3CA94CEF6C001D9A3CEF1F -:1056E0006C001EFB2B0040EF6B001FEB3C000FEF2C -:1056F0006C00202F250B8C2DF7AE8CFE9FFD568065 -:105700000070E48000708C8001B3F4D401E0A05FED -:10571000B3D80280012BACD401E0A06023D8028072 -:10572000012C98D401E0A06077D80280012D4CFEB6 -:105730007C1000780CE9B000055EFDFE7C1000785E -:105740000CE9B000025EFDFE7C1000780CE9B000B0 -:10575000015EFDFE7C1000780CE9B000005EFDE00B -:105760006C0D30EA1C0000F92B00005C5BC060206F -:105770002BC070201BC0A05EFDE07CC1385EFCE049 -:105780006C5A00EA1C02625EFCE06C0E00EA1C0728 -:10579000275EFCD401CE5FA38CD802D401F80B069F -:1057A00048E06A03E7300B1408F20B0049109A1224 -:1057B0009BE06803E83009E0A0A14E149CD802D415 -:1057C00001F80B0648EE7A009F58001302F1EC56E0 -:1057D00004006C00008001006D00010000784401AD -:1057E0000D02F1EC56030000000100423F300B14A3 -:1057F00008F20B0049109A129BEE7842403009E003 -:10580000A0A13C149CD8028001AF8CE1BA00429761 -:105810000A760A140C971C300C2F8BB68C5EFDE1B7 -:10582000BB0042F93A0008582AC0215EFDF93A004F -:1058300008581AC0215EFF781A7809123A780AC00F -:10584000A2143B5E2D781A163A5E2D301B2F8CB8B1 -:105850008B5EFF143BCFB3CF7B0000D401203DCB48 -:105860000F1A9BCD4F1A9CCDCFCFE02FDDD80AD495 -:1058700001203DCB8F1A9BCCAF1A9CCD2FCFE02FB0 -:10588000DDD80AE06C27C4EA1C0000300A300B188F -:10589000983199B12A2019CFE15EFCE06C27C4EA67 -:1058A0001C00005EFC0000EBCD40C0CECF1897304E -:1058B00006E06C288CEA1C0000B886B896B8A6B83A -:1058C00026E0A016170E9CC2CC0E9CC24C0E9CC7A4 -:1058D0006C0E9CE0A002BA0E9CC75C0E9CC27C0EB3 -:1058E0009CC3BCE0A001D2E0A03674008FF8001386 -:1058F00002F1EC5604006D00008001006E00010012 -:1059000000ED8F010D02F1EC5603000000010034A0 -:105910006CE0A09415343CE0A09412EF66002AEFEE -:1059200066002BEF66002C2D37AE86E3CF90C0804B -:10593000009A048000DAE4D401300B998B999BC95A -:105940006CD802D401E0A03491DA0A8000D758EB79 -:10595000CD40C0189730166E8C5C6CE0A0341EC031 -:1059600045301C8F5CC048300C8F5C30060C9C5C52 -:105970005CE3CD80C0D7038000D688EBCD40C01853 -:105980009730166E8C5C6CE0A03446C045301C8F9E -:105990006CC048300C8F6C30060C9C5C5CE3CD8096 -:1059A000C0D7038000D704EBCD40C018973016E075 -:1059B000A03576300B581CC051301C8F3C8F2BC04B -:1059C00098582C8F3BC041301C8F2CC0388F2B3007 -:1059D000060C9C5C5CE3CD80C0D7038000D98CD4DE -:1059E00001E0A03621DA0AD401E0A09CDBDA0A80CB -:1059F00001A890D401300BE06A27C4EA1A000074B1 -:105A0000395809C030301BC058742A580AC02000C9 -:105A1000CCF4001302F1EC5604006E00008001008B -:105A20006F000100005234010D02F1EC560300003A -:105A3000000100302B581CC265189A20AAC0802093 -:105A4000AAC0B0228AC0E0278AC110C1685C6B304E -:105A5000ACE0A03717C1485C6B314CE0A03712C0F6 -:105A6000F85C6B33CCE0A0370DC0A85C6BE06C0039 -:105A7000B4E0A03707C0485C6BE0A03703E0A03774 -:105A800049DA0AE0A03736DA0AD7038000DD4CEBAA -:105A9000CD40801897301C6E9B580BC1516E8C58AE -:105AA0000CC041E0A03752C0586E8C5C5CE0A0375F -:105AB00057300B5C5C581CC051301A8F0A8F1BC0CA -:105AC000E88F0BC0C8300B6E9A581AC051301A8F2D -:105AD0001A8F0BC0488F1B8F0B300C5C5CE3CD80A2 -:105AE00080D7038000DE148000DE28EBCD40E01874 -:105AF0009730066E858F8BCCCFC0700E9CC3BF0EC7 -:105B00009CC4FF3016C0488F850E9CCC2F0C9C5C2B -:105B10005CE3CD80E000005EFF0000EBCD40C024E0 -:105B20000D18971A9C30083009320BB928201BCF6A -:105B3000E1CD9E00069C001302F1EC5604006F00BC -:105B4000008001007000010000425C010D02F1ECD8 -:105B5000560300000001001896ED3C005BE04C008D -:105B600064C2B4FACAFEF40E9B1A9CE0A09F061A07 -:105B70009CE0A0A19D2FFCED3B005B180BE04B00CF -:105B800065C055ED3C005BF80C116430AB1A9A18F7 -:105B90000A201AB48B1A9AED39005B0C092A4918AD -:105BA0009B129E580BC0501538201B1CC8CFD12A01 -:105BB000560D8B180BAC8B2C0DE3CF80C0D7038018 -:105BC00001AE208001B354D401C9FE189B2A4B308A -:105BD000091698364A10C9201ACFE1300B2A5CB852 -:105BE0008BD80AEBCD40C0207D1897A15B502B309D -:105BF0000CFB6C0010505A506930260E9BE06C274D -:105C0000C4EA1C0000C7DCFACBFFF8FE7C4400FEAF -:105C1000B0FDD2C035301CC0F80E9B189ABB1BE0FB -:105C20006CC174EA1C8001C8CF0C9CFE36FF015C7D -:105C30005CCE51300C2F9DE3CD80C0EBCD40C02019 -:105C40007D1897A15B502B301CFB6C0010506850E6 -:105C50003A505930260E9B001717001302F1EC56EC -:105C60000400700000800100710001000056E10195 -:105C70000D02F1EC56030000000100E06C27C4EABD -:105C80001C0000C50CFACBFFF8FE7C4400FEB0FD02 -:105C900099C035301CC0F80E9B189ABB1BE06CC233 -:105CA00004EA1C8001C5FF0C9CFE36FF015C5CCE43 -:105CB00051300C2F9DE3CD80C00000EBCD40FC2087 -:105CC0002D1897149312961094A15B169230250EFE -:105CD0009BE06C27C4EA1C0000C25CE80C15185F4E -:105CE0001804990C9A069BFE7C4400FEB0FD70C01F -:105CF00035301CC0F80E9B189ABB1BE06CC168EADB -:105D00001C8001C30F0A9CFE35FF015C5CCE113084 -:105D10000C2FEDE3CD80FCD401E0A09AD9D80A8005 -:105D200001A750D401793A581AC041300BC11CD890 -:105D30000A580BCFC0581BCFA0582BCF80583BCF51 -:105D400060584BCF40585BCF20301BC02CD80AEB9B -:105D5000CD40801897D303580BC0A16EFC581CC1CE -:105D600011301CE0A03262300C8FFCC0B8581BC050 -:105D7000916EFC580CC061300CE0A0009E5A0013DC -:105D800002F1EC5604007100008001007200010075 -:105D900000C32A010D02F1EC56030000000100329D -:105DA00057301C8FFCD503E3CF80808000D6ACEB4E -:105DB000CD40C0201D1897301CEF4C004CE066C051 -:105DC00040EA1680011A9C0C9B3039173A18CA20F9 -:105DD00019CFD130391A9A320B307CC28FC0502F74 -:105DE000C60C9CCD2EC078300CEF4C004C2F460CCE -:105DF0009CCCBE2FFDE3CF80C00000D4211897308B -:105E0000053006C1380A9BFE35FF015C5BC4E158D2 -:105E10000CC091EF1C0040301BF606094B168CEFAE -:105E20005C004030052FF65C6658A6C5845836C124 -:105E300041FEB0FD8F793C581CC0F1EF1C0040A31F -:105E4000DCEF5C0040300CE06B3F20EA1B0000768A -:105E50003B2F2BB68CCE8B5876C281FEB0FD7A7963 -:105E60003C581CC071E0A09FAD301CEF4C00C0C17D -:105E7000D8E0A09FA7E0643F20EA140000687C7887 -:105E8000BCF01C0000C0D0EF1C0040A7BCEF5C00C1 -:105E900040301CEF4C00C0687B2F2BB68CCC4B00E5 -:105EA0007D15001302F1EC56040072000080010021 -:105EB00073000100007C91010D02F1EC560300001B -:105EC000000100E0A09F9C300CEF4C00C0E0643F5C -:105ED00020EA140000E8060024680C78BCF01C00DE -:105EE00000581CCA31EF1A0040301BF606094B1649 -:105EF0004AEF5A0040301B680A2F2AB48BC9BB30C6 -:105F00001C2BE7AE8CD82A8001B2208001B2382C3D -:105F1000DCB88B5EFD0000D401FEB0FC8FD80AD443 -:105F200001E0A03375D80A8000DA48D401FEB0FC45 -:105F30007FD80AD401FEB0FC8DD80AD401FEB0FC93 -:105F400083D80AEBCD40801697FEB0FCA3189B0EB9 -:105F50009CFEB0FCF1E3CF80800000EBCD408016CA -:105F600097FEB0FC97189BEE0C100AFEB0FCEEE317 -:105F7000CF8080D4012D6CB88BC03CD80A0000EBD8 -:105F8000CD40C0216DFEB0E28D1897FEB0FCF41834 -:105F900096E0A0A013300CFB5C0054FB6C002D308D -:105FA000ABFB6B002EFB6C0030FB6C00312D660DE3 -:105FB0008C580CC1705807C2A0300CFB6C002C3000 -:105FC0005CFB6C0031FA001302F1EC560400730024 -:105FD00000800100740001000068B9010D02F1ECBD -:105FE00056030000000100002D30BCFB6C002EFAAF -:105FF000CCFFD41A9B32C9190A16AA2049CFD1E086 -:10600000A06FDEC1685807C140301CFB6C002C300B -:106010005CFB6C002D30BCFB6C002EFACCFFD41A5C -:106020009B32C9190A16AA2049CFD1E0A06FC82E09 -:10603000ADE3CF80C0D703800038DC800153D4D4D7 -:1060400001348CE0A090C6320CE0A09EB9348CE004 -:10605000A090E2D80A0000D401348CE0A090BA32BB -:106060000CE0A09E83348CE0A090D6D80A0000D427 -:1060700001348CE0A090AE321CE0A09EA1348CE0F4 -:10608000A090CAD80A0000D401348CE0A090A232BB -:106090001CE0A09E6B348CE0A090BED80A0000EB00 -:1060A000CD40801897348CE0A090940E9CE0A09E88 -:1060B00087348CE0A090B0E3CF80808001B1D4EB36 -:1060C000CD40801897348CE0A090840E9CE0A09E78 -:1060D0004D348CE0A090A0E3CF8080800195E880D3 -:1060E00001B1808001962C000583001302F1EC566B -:1060F000040074000080010075000100000201012D -:106100000D02F1EC56030000000100D401E0A033C1 -:1061100009D80A8000DB14D5035EFDD401581CC0E9 -:1061200041E0A03463D80AE0A03450D80AD70380F5 -:1061300000DDDC8000DDBC2D6C198C5EFC00002DC8 -:106140000CB88B5EFD00002D0C198C5EFC00002C41 -:10615000ECB88B5EFD00002CEC198C5EFC00002D71 -:106160001C198C5EFC0000D401F96B002F5C5BC035 -:1061700031301BC3ECD80A2D2C198C5EFC00002D8D -:106180002CB88B5EFD00002CFC198C5EFC0000F925 -:106190006B0031580B5E0DF92B005A2FFBF96B0089 -:1061A0005AF92B005AE04B00655E5D364B2A6CB8FD -:1061B0008B5EFD2BAC198C5EFC00002BACB88B5EAB -:1061C000FD00002CCCB88B5EFD00002C8CF92B0060 -:1061D00000169C5EFC00002C8CB88B5EFD00002C31 -:1061E0007C198C5EFC00002C7CB88B5EFD0000EB03 -:1061F000CD408018975C5BC091301BCD4E2C678ED4 -:106200008C2FFCAE0CE3CF8080300C00911000137B -:1062100002F1EC56040075000080010076000100D8 -:106220000097CA010D02F1EC560300000001002C9A -:1062300067AE0CE3CF80802C6C988C5EFC0000D4A1 -:10624000015C6A5C6CE0A032D7D80A8000DBC42A0B -:10625000DCB88B5EFD00002ADC198C5EFC0000EBD4 -:10626000CD40C018973006C8EFC02030160E9CCF26 -:106270004FC080301CEF3B0053F80B094C18465CB4 -:10628000760E9CC94FC030A3A65C760E9CCA5FC038 -:1062900030A5A65C760C9C5C7CE3CD80C00000EB56 -:1062A000CD40E0202D18973005300CBA8CE066BF49 -:1062B00018EA1680010C9C2F8CFEB0FCAF0E9CC718 -:1062C0006FC780300CBACC3018FAC9FFFC300AE036 -:1062D0006B008C305CFEB0FD1FC0B01BCCEDBC0071 -:1062E00000C0720C9C2F4CFEB0FC98301CBA8C1B6A -:1062F0008C580CC630301B0E9C2BCCE06A3F20EA39 -:106300001A0000745A74BA745A5D1AE0A09E8C1870 -:1063100095EF3C0044500C0C9C2F0CFEB0FC7EEF23 -:106320003C00C5580CC251EB3C0082EF3B004400DE -:106330006FAE001302F1EC560400760000800100FD -:1063400077000100002871010D02F1EC56030000F6 -:10635000000100163CC0D20C9CFEB0FC71301CEF5A -:106360006C0043EB3B0083E06C00FFC42CC328EFC0 -:106370003C0044EB3B0083163CC2C22FD60C9CFE73 -:10638000B0FC5E300CEF6C0043300BEB3C0082C382 -:106390000CC208EF3C0044E04C0079C0C50C9CFEE8 -:1063A000B0FC4E301CEF6C0043364BE06C00FFC27B -:1063B0000CC108EF3C0044E04C0064C0B42FD60C84 -:1063C0009CFEB0FC3D300CEF6C0043300B378CC1B1 -:1063D0000C3015C0582E860C9CFEB0FC31300B0ED4 -:1063E0009CCFBE0A9C5C5C2FEDE3CD80E00000EB0F -:1063F000CD40C0201D16971A9B300AB68AB69A3037 -:106400008BBA8BBA9CE066008C30291A9AF7D6C0FA -:1064100008305CFEB0FC66C031300CC0D8309CBA8D -:106420008CBA9730291A9AF7D6C008305CFEB0FCB7 -:1064300059CF40301C2FFDE3CD80C0EBCD408018FC -:1064400097CDDEC0A0301A300B304CC0CF300B0ED1 -:106450009CCD9E006AC3001302F1EC560400770045 -:10646000008001007800010000BF9A010D02F1ECEC -:1064700056030000000100E3CF9080E3CF8080EB63 -:10648000CD40E0189616973005C4FCC1500C9CC551 -:106490000CC3600E77C0402017C060C0883F4CFE20 -:1064A000B0FBDEC0483F3CFEB0FBDA3015301B0CC1 -:1064B0009CCD5EC258E0A09DDB29AC988C580CC1E5 -:1064C000F10C9CC70EC050E0A09DD2292C988C0CDA -:1064D0009CCD7EE06B9C40F60C1900C0E30E77C0AB -:1064E000402017C060C0883F4CFEB0FBB9C0483F99 -:1064F0003CFEB0FBB53015300B0C9CCB0E0A9C5CFF -:106500005CE3CD80E00000D401581BC095301A2B0D -:106510009CB88AF9DBC010FEB0FB22D80A300BF918 -:106520006B0047C0ACD80A2B9C198C5EFC00002B7A -:106530008C198C5EFC0000EBCD40E018971696ECB1 -:106540000C1518C0B1E0A09D931895300B0E9CC49B -:106550002E29258A8CFEB0FB032B87AE86E3CF80E5 -:10656000E0D7038001B3F4EBCD40C0201D1897C6DF -:10657000EEC3A13006300C00F6FA001302F1EC561F -:1065800004007800008001007900010000FF210173 -:106590000D02F1EC56030000000100BA0C0E9CFE47 -:1065A000B0FE145C6CFEB0D46FC200FEB0D500E04B -:1065B0004C00C8C030FEB0D501FEB0FDA9300B0EB6 -:1065C0009CFEB0FE070E9CFEB0FE08C0D19A8B2F39 -:1065D000FBBA0B300B0E9CCA8D1896C0519A8CE0FA -:1065E0004C9C40CF15FEB0FD875806C0509A8CE0F9 -:1065F0004C9C40C045300CEF6C0057300CEF6C00E9 -:1066000051300B0E9CFEB0FDE52FFDE3CF80C08026 -:10661000002310EBCD40F8202D18971696301CBAA9 -:10662000DC3004300CBA3CBACCBACCC0481BCB2FFF -:10663000FBBACB1BCC58ACC084EF1C00661BCBF85C -:106640000B0A4CA19CCF42E065BE98EA1580011B65 -:10665000CC500C0A9CFEB0FB171BCC58ACC0612F71 -:10666000850A9CFEB0FB10CBF83003C128EF1C005C -:106670005CF8030A4CA19CC0A2E06C3F20EA1C001D -:1066800000F803032C78BC782C5D1C2FF35C535866 -:10669000A3CEE5EF1C0066EDBC000500F24100133F -:1066A00002F1EC5604007900008001007A0001003C -:1066B000006AEA010D02F1EC56030000000100C07F -:1066C000A3EF1C0066EDBC0008C053E06B13880C00 -:1066D0009CC3FF1BDC580CC6A00E9CE0A03264C417 -:1066E000D0300CFEB0D3E2C620FEB0D479FEB0FDAF -:1066F00021300B0C9CFEB0FD7FC118ED3C005558BD -:106700001CC0C1FEB0FD0A301B0C9CFEB0FC9AFE02 -:10671000B0FD10300CED6C00552FF45C545834C2B1 -:10672000340C9CFEB0FD6CC101301B0C9CFEB0FC17 -:10673000899ABB2FFBBA3B300B0C9CCC6EC0519A94 -:10674000BCE04C1388CEE50C9CC17FC0D1ED3C0071 -:1067500055580CC051FEB0D469581CC0509ABCE0CA -:106760004C1388CCC5FEB0FCD9300CED6C00513018 -:106770000B0C9CFEB0FD40C1A80C9CFEB0FD40C1BE -:1067800001301B0C9CFEB0FC5D9ABB2FFBBA3B306A -:106790000B0C9CC9AEC0519ABCE04C0BB8CEE51BAB -:1067A000CC500C0A9C2F0CFEB0FA803004EF540041 -:1067B000663003C128EF1C005CF8030A4CA19C0062 -:1067C0009638001302F1EC5604007A0000800100B4 -:1067D0007B00010000D551010D02F1EC56030000D1 -:1067E000000100C0A2E06C3F20EA1C0000F8030397 -:1067F0002C78BC781C5D1C2FF35C5358A3CEE51B92 -:10680000CC500C2E850A9CFEB0FA62300CC068EEAB -:106810000C001B28EBB6042FFC5C6C586CCF953039 -:106820000B0C9CCA8E300B0C9CFEB0FD4B2FEDE385 -:10683000CF80F88000DEE4800021E88000231C8007 -:10684000002368EBCD40E0189730063005C158E0D2 -:106850006C3F20EA1C0000F805032C78BC782C5D06 -:106860001CC090EF1C0040301BF605094B168CEF46 -:106870005C00402FF55C655885CEB52C078E8C5892 -:106880000CC02130160C9C5C5CE3CD80E00000D491 -:10689000211894169614970C9CFEB0FD3D1895EDAA -:1068A0003C0039581CC0D1E06CC248EA1C8001FE93 -:1068B000B0FA0E300CFEB0FC9F0C9B089CCCFE582E -:1068C00005C2F0EDB50000C052300B0C9CFEB0FCD0 -:1068D000B9EDB50002C1020C9CFEB0FD3DF9D5B08A -:1068E00008E0A000C5E0001302F1EC5604007B00B4 -:1068F000008001007C00010000C179010D02F1EC73 -:106900005603000000010041ABF9D5B008E0A02A11 -:10691000735817C0310C9CC70E0A9CE21C00185912 -:106920000CC0D1EE0C1518C0305837C0810C9CFE3D -:10693000B0FDE0F9D5B008E0A02A5E300B0C9CFE5B -:10694000B0FCF4D82AD7038000FF548000D0ECEBD1 -:10695000CD40801897300CEF6C0056EF6C0057302C -:106960003BEF6B0032EF6C0051301B0E9CFEB0FC15 -:1069700067EF1C003A580CC050301B0E9CFEB0FC58 -:10698000B7301CEF6C00550E9CFEB0F8F5E3CD80DF -:10699000800000EBCD40E0202D1897169530060AB8 -:1069A0009C187CC040201CC270C4D8E06C2894EABB -:1069B0001C0000EF2B0051581BC0A198BB2FFBB847 -:1069C0003B98BCE04C9C40C2653016C3C898AB2FC6 -:1069D000FBB82B98BB2FFBB83B98ACE04C9C40C15C -:1069E000A5EF3C00572FFCEF6C0057301CEF6C00FC -:1069F000543026C288E06C2894EA1C0000EF3B006B -:106A000032582BC0D1989B00DBC6001302F1EC5624 -:106A100004007C00008001007D00010000ABC1018A -:106A20000D02F1EC560300000001002FFBB81B988B -:106A30009CE04C9C40CDC4301B0E9CFEB0FB44C17E -:106A400048988B2FFBB80B989B2FFBB81B988CE0BA -:106A50004C9C40CF25EF3C00562FFCEF6C0056308D -:106A60001CEF6C00543026EF3C0054580CC3010A54 -:106A700075C0402015C1C0C508EF2C0051582CC06E -:106A8000305816C4A13005EF650057E06C2894EA31 -:106A90001C0000B825B835EF3C0030580CC3D1308D -:106AA0001B0E9CFEB0FBDE2AF7AE85C368EF3C00F0 -:106AB00032583CC0305816C30130052AA7AE85E0D5 -:106AC0006C2894EA1C0000B805B815C268EF3C00B9 -:106AD00054580CC220EF3C0056581CC054EF3C00E8 -:106AE00057581CC175EF3A0057EF3B0056BB1BE0EF -:106AF0006CC180EA1C8001FEB0F90E0E9CC3BFE0A1 -:106B00006C2894EA1C00003005B825B835B805B8E3 -:106B100015300C2AC7AE8C0C9C2FEDE3CD80E0EB3A -:106B2000CD4080E0A0039AE0A00406006FAF001300 -:106B300002F1EC5604007D00008001007E0001009F -:106B4000003E0A010D02F1EC560300000001003086 -:106B500007C0E8F3D7C008300A300B300CE0A007BC -:106B600077F7D7C008305CE0A007802FF75C575953 -:106B7000E7CF15300CE06B4184EA1B0000F76C0195 -:106B8000ACF74C01B8F74C01BCF74C01C0F74C0115 -:106B9000C4300AF74A01C8F74A01CCF74A01D0309D -:106BA0005AF76A01B130AAF76A01B0F76C01ADF784 -:106BB0006C01AEF74C01B4F76A01B2F76C01AFE3B8 -:106BC000CF8080E06B4184EA1B0000F76C01AF5E70 -:106BD000FD0000D431409240A340B6E0674184EA12 -:106BE000170000EF3C01AF581CC0313005C0283001 -:106BF00055EF3401AC59E4C144F3D4C0080C9A06F3 -:106C00009B049CE0A00724F7D4C008F9D5C008E095 -:106C1000A0072CEF3C01AC2FFCEF6C01ACC278302C -:106C200004C188E80C1502EE0C000BF3D4C008F682 -:106C3000FA00F477FB0E0C781CE0A00709F7D4C02B -:106C400008EE04000CF93C018DE0A0070F2FF400C2 -:106C500073CB001302F1EC5604007E0000800100AB -:106C60007F0001000081B1010D02F1EC560300002C -:106C70000001005C5459D4CE8531D90C9A069B048E -:106C80009CE0A006F731DBF9D5C008E0A00700586A -:106C900035C104EEFC01BC2FFCEF4C01BCEEFC0145 -:106CA000BCEE5C4241C143EE7C4240EF4C01BCC0B3 -:106CB000F8EEFC01B82FFCEF4C01B8EEFC01B8EE89 -:106CC0005C4241C053EE7C4240EF4C01B8E0A0066C -:106CD0002D1893E0A005EE1894E0A00363EEFC01EC -:106CE000B8E0A05CEF3008FC194034E0A05BEFE0B6 -:106CF000A05CBD1896EEF001C4009CE0A05CE23000 -:106D000008FC194034E0A05BE2E0A05CB01892EF10 -:106D10003C01B020ACC04020ACC550C748E06199F0 -:106D20009AEA113F19069C029BE0A04AEFC10208B3 -:106D30009C029BE0A04AEAC0B25835C094314CEFA7 -:106D40006C01B0A190009CE0A00446C5C8EEFC0117 -:106D5000C42FFCEF4C01C4EEFC01C4EE5C4241C008 -:106D600053EE7C4240EF4C01C45845C4C5E0A0023C -:106D7000A5EEFC009E71001302F1EC5604007F00AA -:106D80000080010080000100003CDA010D02F1ECFE -:106D90005603000000010001B4581CC461E0460322 -:106DA000E9C433EEF40184301B089CE0A04AB4C06F -:106DB00032EE148000FC134220089C069BE0A04A9F -:106DC000ABC0F2EEF40188301B089CE0A04AA4C0DE -:106DD00032EE148000089C069BE0A04A9DC253300E -:106DE0000CEF4C01B4C218E061999AEA113F190600 -:106DF0009C029BE0A04A90C062089C029BE0A04AD3 -:106E00008BC05330ACEF6C01B0C0F8EEFC01C02F6A -:106E1000FCEF4C01C0EEFC01C0EE5C4241C053EE01 -:106E20007C4240EF4C01C03004EF6401ADEF3C0107 -:106E3000B1202C5C5C585CF9BC0205FE0C001C986F -:106E4000CC180F000E010C004001FA023402F05879 -:106E500035C154EEFC01BC581CC061EF3C01B0EFE1 -:106E60006C01B2C67958ACE0810165304CEF6C0121 -:106E7000B1E0A00435EF4401B8C5C9EF4401BCC579 -:106E800099EEFC01B4581CC351EF3C01B0C67D58CB -:106E90001CC301E04603E9005160001302F1EC5607 -:106EA00004008000008001008100010000704901A1 -:106EB0000D02F1EC56030000000100C0825806C02C -:106EC00060EF3C01AEEF6C01ADC268E04203E9C087 -:106ED000325802CF71EEF50184301B0A9CE0A04AC3 -:106EE0002DC032EE158000FC1342200A9C069BE068 -:106EF000A04A30C0F2EEF50188301B0A9CE0A04A9F -:106F00001DC032EE1580000A9C069BE0A04A22CDEF -:106F100093EF4401B4EEFC01B4580CC191E046017A -:106F200091C0825806C060EF3C01AEEF6C01ADC06D -:106F3000F8EF3C01AE580CC060E04200FBC0325894 -:106F400002CF31EF3C01B0C5EDEF6C01AD303CEF4D -:106F50006C01B1EF3C01ADEF6C01AEEF4401B8EF55 -:106F60004401BCEF4401C0EF4401C4E0A0034CCF96 -:106F7000385845C235EEFC01B8581CC041E0A002AB -:106F800023CEA8EEFC01B8586CE08300E6300BEE8F -:106F9000FC01B8E0A002F4EF3C01AE583CC041EF68 -:106FA0004401B4C058E0A00545EF4C01B4302CEFCB -:106FB0006C01B1EF4401BCCCF8EF4400BA2C0013D3 -:106FC00002F1EC5604008100008001008200010003 -:106FD00000E582010D02F1EC560300000001000102 -:106FE000B8EF3C01B058ACC4B1EEFC01C458ACE001 -:106FF0008300C5300BE0A002D5EF3C01AEE0A00558 -:107000002BEF4C01B4EEF601D4301B0C9CE0A049F0 -:10701000A70C9CC032EE1C80003015EA153FC00A58 -:107020009BE0A0499DE08300AAEEF301D8301B0647 -:107030009CE0A04995069CC032EE1C80000A9BE0B3 -:10704000A0498EE083009B301B069CE0A04988C0CD -:1070500032EE138000301B0C9CE0A04981C032EE60 -:10706000168000069C0C9BE0A04986E082008730D9 -:107070005CEF6C01B1CB9DEF4401C0C7F8EF440158 -:10708000C4C7C8EEFC01B8586CCA42EEFC01C05837 -:107090001CC0A1EEFC01C4E0A002D4EF3C01B0EFA3 -:1070A0006C01B2C6B8585CC693EEFC01BC585CC615 -:1070B00053306CEF6C01B1EF4401B8C5F8EF3C01FF -:1070C000B0594CC5B1EEFC01B4581CC301E04603F5 -:1070D000E9C0825806C060EF3C01AEEF6C01AD0024 -:1070E000413A001302F1EC560400820000800100D6 -:1070F00083000100005A39010D02F1EC5603000033 -:10710000000100C268E04203E9C0325802CF71EECC -:10711000F50184301B0A9CE0A04934C032EE158092 -:1071200000FC1342200A9C069BE0A04937C0F2EE07 -:10713000F50188301B0A9CE0A04924C032EE15807E -:10714000000A9C069BE0A04929CD93EF4401B4EED0 -:10715000FC01B4580CC151E0460191C0825806C0F0 -:1071600060EF3C01AEEF6C01ADC0B8E0420191C0F0 -:10717000325802CF71EF3C01B2C69CEF6C01AD30CA -:107180003CEF6C01B1EF3C01ADEF6C01AEEF44019F -:10719000B8EF4401BCEF4401C4EF4401C0EF3C012F -:1071A000AD581CC031301CC0A8582CC031302CC088 -:1071B00068583CC031303CC028300C5C5CD8328010 -:1071C00001394C800138F6EBCD40E0300B58ACC0B3 -:1071D000C1E06A4184EA1A0000F4FC01C8F4F60137 -:1071E000CCF4F501D0C128594CC0C1E06A4184EA11 -:1071F0001A0000F4FC01DCF4F601E0F4F501E4C04F -:1072000058300C006F41001302F1EC56040083006B -:107210000080010084000100004E11010D02F1EC1C -:107220005603000000010030063005303B5C5B581F -:107230003BC194E067999AEA173E99E0A0048A0E50 -:107240009BE0A048BDC1120C9CE0A004830E9BE013 -:10725000A048B6C0A20A9CE0A0047C0E9BE0A04817 -:10726000AFC032300CC028301C5C5CE3CD80E0EB5A -:10727000CD40F8300B58ACC0D1E06C4184EA1C0022 -:1072800000F8F501C8F8F401CCF8F301D03006C1DC -:1072900068594CC101E06C4184EA1C0000F8F5011A -:1072A000DCF8F401E0F8F301E4E066999AEA16BE2E -:1072B00099C058300530043003303B5C5B583BC408 -:1072C000640C9C0A9BE0A0487BC112E067CCCCEA2E -:1072D00017BDCC089C0E9BE0A04872C082069C0E95 -:1072E0009BE0A0486DC032302BC3180C9C0A9BE079 -:1072F000A04866C112E067CCCDEA173DCC089C0ED1 -:107300009BE0A04851C083069C0E9BE0A0484CC067 -:1073100033301BC1C80C9C0A9BE0A04851C092E0CE -:107320006BCCCDEA1B3ECC00E18D001302F1EC5694 -:107330000400840000800100850001000024A901F0 -:107340000D02F1EC56030000000100069CE0A0488D -:107350003DCF220C9C0A9BE0A04844C092E06BCC3D -:10736000CCEA1BBECC069CE0A0483CCD03303B16CB -:107370009C5C5CE3CD80F8E06C4184EA1C0000304A -:107380000BF94B0168F94B016CF94B01705EFDEB99 -:10739000CD40FEE0674184EA170000EEFC01743046 -:1073A0000BE0A095F5C191EEFC0178300BE0A095C3 -:1073B000EFC131EEFC017C300BE0A095E9C0D1EECD -:1073C000FC0168EF4C0174EEFC016CEF4C0178EEAF -:1073D000FC0170EF4C017CEEF40168EEFB017408D7 -:1073E0009CE0A045ADCF3C1892EEF5016CEEFB01A0 -:1073F000780A9CE0A045A4CEAC1893EEF60170EE9E -:10740000FB017C0C9CE0A0459BCE1C1891EEFC017E -:1074100080049BE0A04602CDACEF4C0180EEFC0165 -:1074200084069BE0A045FACD2CEF4C0184EEFC01D4 -:1074300088029BE0A045F2CCACEF4C0188EF440100 -:1074400074EF450178EF46017CE3CF00C498001348 -:1074500002F1EC5604008500008001008600010066 -:1074600000B162010D02F1EC560300000001008042 -:10747000FED7038001B140E06C4184EA1C0000307B -:107480000BF94B0180F94B0184F94B0188F94B0151 -:1074900074F94B0178F94B017C5EFDEBCD40FB208C -:1074A0005D31DBFACCFFF8E0A00352402CBFDCE0FA -:1074B00066D70BEA163D230C9BE0A047A5C03230EF -:1074C0000C502C4037301B0E9CE0A04791C032EE90 -:1074D0001780000E9C0C9BE0A04796C032300C50E9 -:1074E0003C4047301B0E9CE0A04782C032EE178024 -:1074F000000E9C0C9BE0A04787C032300C504CE043 -:1075000060C1F8EA101A63E061A5DCEA11404CE0C2 -:10751000654000EA15408FFC174034E0634184EA7F -:10752000130000402CE0A058D930080E99E0A05874 -:107530004C30080A99E0A0588500980299E0A058BC -:1075400044BB1BE6FC0168E0A058C8BB08E0A0579C -:1075500027E0A04703E74C0168C4BCE74C01684042 -:107560003CE0A058BB30080E99E0A0582E3008002F -:107570001742001302F1EC5604008600008001005F -:1075800087000100000ED9010D02F1EC5603000046 -:107590000001000A99E0A0586700980299E0A058FD -:1075A00026BB1BE6FC016CE0A058AABB08E0A05774 -:1075B00009E0A046E5E74C016CC2DCE74C016C40F9 -:1075C0004CE0A0589D30080E99E0A0581030080AF1 -:1075D00099E0A0584900980299E0A058081496161E -:1075E00097E6FC0170E0A0588B0C980E99E0A0562D -:1075F000E9E0A046C5E74C0170C0DCE74C01702F04 -:10760000BDE3CF80FBD703800137D08001375680A0 -:1076100001352CEBCD40801897301BEA1B4334E03A -:10762000A046F8C083FC1CC3B40E9BE0A0451A180A -:1076300097C0D8FC1BC3340E9CE0A046F7C072FC78 -:107640001C43B40E9BE0A0450D18970E9CE3CD8023 -:10765000800000EBCD40FC16923007300459FCC08E -:107660003331E6C0385C5C18963005C1985812C1B9 -:10767000B1EA0C1118E0634184EA1300005C5CE697 -:107680000C002367EC0E9BE0A044EC1897E6FC008E -:10769000F0089B00E288001302F1EC56040087001A -:1076A0000080010088000100009932010D02F1EC18 -:1076B00056030000000100E0A044E618942FF55C9A -:1076C000550C35C0645802CE51EA0C111DCE6B5CCE -:1076D000560C9CE0A046F81896E0634184EA13003B -:1076E000000E9C0C9BE0A04599E74C01D4089C0C33 -:1076F0009BE0A04593E74C01D8E3CF80FC0000E07D -:107700006C4184EA1C0000300BF94B01DCF94B01A1 -:10771000E0F94B01E45EFDD431202D300B500B30ED -:1077200000300159FCC04331DC501CC058FE3CFF06 -:10773000015C5C501C3007C148400C680BE0A04461 -:10774000A3500C0A066DEC009BE0A0449D1890EC41 -:10775000FC00F0029BE0A0449718912FF75C77E0C3 -:10776000664184EA160000401C1837C2C4ED35019A -:10777000AC59E5C0640E15FE35FF015C55C048EEFE -:1077800005111D5C55A3650C940A046803EC050003 -:107790000C204C7802069C049BE0A04407E06B9907 -:1077A0009AEA1B3E99E0A04647CC83301B069CE03A -:1077B000A04642CC33300B0096F7001302F1EC5692 -:1077C00004008800008001008900010000D98901BF -:1077D0000D02F1EC56030000000100049CE0A046FD -:1077E00049CBE258B7CBC55C770E9CE0A0467E182B -:1077F00097400C0E9BE0A04523ED4C01DC009C0E55 -:107800009BE0A0451DED4C01E0029C0E9BE0A045D5 -:1078100017ED4C01E42FEDD83AD7038001160CD4B4 -:1078200031208DE06C37BDEA1C3586506C505C50C1 -:107830004C300C503C502C3000E0674184EA17007B -:1078400000EF3C01AC59ECC034501CC03831EC5056 -:107850001CEEFC01B8401B183BC092401CF80B16F4 -:107860001F160CA15C5C5C507CC048A19C5C5C5009 -:107870007C300CBA8CC158EE1C80000A9BE0A045FD -:10788000EDC0C3009C0C9BE0A044101890404BFC42 -:107890001C3F80E0A0440A504C1B8B2FFBBA8B1B73 -:1078A0008C407B163CE08400A4401C1B861826FEFE -:1078B00036FF015C56ECC1FF015C51A361EE010093 -:1078C0000B7604A366EE0600056A0C760BE0A04377 -:1078D0007F301BE0A045C2C0736A0C0042B30013A6 -:1078E00002F1EC5604008900008001008A000100CA -:1078F000004C42010D02F1EC5603000000010008AB -:107900009BE0A043771894C0686A0B089CE0A043F2 -:107910007118940E0163E30E066DEC63EBE0A04377 -:1079200069301BE0A045ACC0736DEC069BE0A04342 -:10793000611893C0686DEB069CE0A0435B1893E26E -:10794000F200F0ECFC00F0E2FB00F0E0A04352306B -:107950001BE0A04595C083ECFC00F0049BE0A04335 -:10796000491892C078ECFB00F0049CE0A043421858 -:10797000923011EA1140A0089C029BE0A04580C013 -:10798000B3069C029BE0A0457BC063049C029BE085 -:10799000A04576C3F26A04301B089CE0A04570083D -:1079A0009CC032EE1C8000E065CCCDEA153D4C0A4F -:1079B0009BE0A04565C0C3403C089BE0A0438850C5 -:1079C0003C406BFC1C3F80E0A04382506C6DE43077 -:1079D0001B089CE0A04554089CC032EE1C80000AA5 -:1079E0009BE0A0454DC0C3402C089BE0A0437050D5 -:1079F0002C405BFC1C3F80E0A0436A505CECF6002E -:107A00007D91001302F1EC5604008A000080010011 -:107A10008B00010000F3F9010D02F1EC56030000A8 -:107A200000010000F0301B0C9CE0A0453B0C9CFECC -:107A300093FF48C48B403C406BE0A04425EF4C01D1 -:107A4000C8402C405BE0A0441FEF4C01CC404B00F1 -:107A50009CE0A04419EF4C01D02F8DD83A0000EBE8 -:107A6000CD40F830073006C2E8EC0C111D5C5CA379 -:107A70006CE06A4184EA1A0000F40C0009F2FB0091 -:107A8000F073E3F40C0305169CE0A04389189406F8 -:107A90009C069BE0A0438418930A9C0A9BE0A043A9 -:107AA0007F069BE0A04326089BE0A04323E0A0566E -:107AB0006FE0A0856FE0A044AB0E9BE0A0431A18D6 -:107AC000972FF65C565866CD15FC1B40C00E9CE007 -:107AD000A043DAE3CD80F8EBCD40FC300730063030 -:107AE00004C388E80C111D5C5CA36CE06A4184EA65 -:107AF0001A0000F40C0009F2FB00F073E3F40C032D -:107B000005169CE0A0434C1892069C069BE0A043FF -:107B10004718930A9C0A9BE0A04342069BE0A042C0 -:107B2000E9049B00736B001302F1EC5604008B0018 -:107B3000008001008C00010000E7D1010D02F1EC92 -:107B400056030000000100E0A042E6E0A05632E04B -:107B5000A08532E0A0446E18950E9C0A9BE0A042DE -:107B6000DB18970A9C0A9BE0A0432C0C9BE0A042E8 -:107B7000D318962FF45C545864CC75FC1B40C00E8F -:107B80009CE0A04393189BE0A0431C1897FC1B406B -:107B9000C00C9CE0A0438A0E9BE0A0424FE3CD8046 -:107BA000FCD703800138688001966C800114E8805E -:107BB0000111CC80011360800110F0EBCD40E0306A -:107BC00016582CC1613017EA173F00E0654184EA7E -:107BD000150000EAFC01D40E9BE0A04475C1D3EA75 -:107BE000FC01D80E9BE0A0446FC1733006C1585809 -:107BF0001CC131FC17BF00E0654184EA150000EAB2 -:107C0000FC01D40E9BE0A0446BC072EAFC01D80ECC -:107C10009BE0A04465CEB30C9CE3CD80E0D703800D -:107C200001157CA36BE06A4184EA1A0000F40B039F -:107C3000099909140B77EA991AF6FB00F0992B5E63 -:107C4000FD0000A369E06800D9B0001302F1EC5612 -:107C500004008C00008001008D000100008D69018E -:107C60000D02F1EC560300000001004184EA180007 -:107C700000F009090C1009F34B0078F34A00F05E9C -:107C8000FD0000E06A4184EA1A0000140BF76C0161 -:107C90008C5EFDEBCD40801897300BE0A04432C0E5 -:107CA00072FC1CBF800E9BE0A0429E18970E9CE3C6 -:107CB000CD80808001159480011278D43121FD148B -:107CC000961297502C503B300550C5371032B132C8 -:107CD000D232540D8CF80B1518C04140CC2E1DD853 -:107CE00032083CC091506550755085509550A55054 -:107CF000B5300CC0A82FF6189B1A9CE0A0061ECE2B -:107D0000A73FFCCEDBA1AC189BA3AB0D9A2FF6F4DA -:107D1000C90020CF902039C0D02089C0602029C060 -:107D2000702039C0C1C088A1BC5C7CCEEB169CCE53 -:107D3000CBA3BCCFBBA5AC5C7CCE7BE04A002AC009 -:107D4000E16E0A740A50EA6E092FC98F09580AC0F9 -:107D5000475C3A50EA169C2FF6C15850E5C0E840FF -:107D6000EAE069FFFFEA197FFF123A002D44001391 -:107D700002F1EC5604008D00008001008E0001002D -:107D80000018A2010D02F1EC56030000000100C032 -:107D90006030A9F409034B230B50EB2FF60D8B3DFC -:107DA0000A160A58AACEF30D8BE04B002EC0403FB6 -:107DB000FB50DBC2280D9B2FF6E04B002AC0916ED2 -:107DC0000B760B50DB6E0B2FCB8F0B2FF6C1585061 -:107DD000D5C0E840DAE069FFFFEA197FFF123AC038 -:107DE0006030A9F409034B230B50DB2FF60D8B3DBC -:107DF0000A160A58AACEF3FB5C003C0D8BE06CC25D -:107E000050EA1C8001E0A09267C0200D3CFB6C0092 -:107E10003E5C5CE04C0068C0910D8BE04B0068C09C -:107E200051362CFB6C003EC0A8E04C006CC0810DAC -:107E30008CE04C006CC041FB60003E2FF6FACCFF9A -:107E4000C0505C0D3B320CF6CA0025C2D021CAE0FE -:107E500080008F204AE083016D203AE08300892171 -:107E60000AE08000B5209AE0800083202AE08001AB -:107E700056201AE08000F0E088015C204AC7832089 -:107E80001AE08000E9205AC3E0201AE08000A00038 -:107E90003D7D001302F1EC5604008E0000800100CD -:107EA0008F00010000A719010D02F1EC560300003C -:107EB000000100201AC270203AC0E0202AE08000B1 -:107EC00099203AE0800096C469FACCFFC0406BF874 -:107ED0000B0B04C4F96E0C780C504C6E0B2FCB8F2F -:107EE0000B40DA580AC057E0A09210189BC0983097 -:107EF0000BE0A091D1C040404B182BC02840DB5074 -:107F00007BC3B96E0C780A300BBB1B6E0C2FCC8F69 -:107F10000CBB0AE61B0000BB1BFACCFFC0504C3761 -:107F20008B240CC90DC299FB3C003E262CC280203C -:107F30006CC120202CC1D0202CC060205CC19020BE -:107F40009CC0F0C22840CC6E0B760B970C6E0C2FA9 -:107F5000CC8F0CC12940CC6E0B760BB60CCF8B406E -:107F6000CC6E0B760B970C6E0C2FCC8F0CC059403F -:107F7000CAF40B141F6E0C780CB91BCE9B40CC6E50 -:107F80000B760BB68CCF1B40CC6E0B760B970CCDC3 -:107F9000FBFB3A003EE04A004C6E0AB5082F8A8F80 -:107FA0000ABB19F20A1501C072FACCFFC0406AF888 -:107FB0000A0B0200CB52001302F1EC5604008F00B2 -:107FC000008001009000010000B771010D02F1EC8A -:107FD00056030000000100C138FB1A003CEDBA0056 -:107FE00001C072FACCFFC0406AF80A0B01C088A138 -:107FF0009AC092FACAFFC04069F4090B0C406A2F7C -:10800000FA506AFACAFFC0406C180A504A1A9CCD4E -:108010008DCC58FB3C003EE04C006CC0516E0A1504 -:10802000083009C0D8003CC080E04C006AC0506EE7 -:108030000A15083009C0486E0AB5082F8A8F0ABB96 -:1080400019E04C0068C0315C78C0C8E04C0062C0E8 -:10805000315C58C078E04C0074C040E04C007AC0FD -:10806000313009BB19FB1C003CA58CC742BB08582A -:10807000085C29C700169CA5BCE04C0078C6B1334B -:108080000CFACAFFC04069F4090B0C406A2FFA5081 -:108090006AFACCFFC0F80A0B0BC5A8FB3A003E26D3 -:1080A0002AC0E0206AC130202AC250202AC2702093 -:1080B0005AC210203AC190206AC100C2686E09F20B -:1080C000CAFFFC8F0A72085C68C2486E09F2CAFFD8 -:1080D000FC8F0A72085C8800ABF2001302F1EC56C8 -:1080E00004009000008001009100010000A3CC0179 -:1080F0000D02F1EC56030000000100C1D86E09F238 -:10810000CAFFFC8F0A72083009C1886E09F2CAFFE3 -:10811000FC8F0A7208C1086E0AB5098F0AC0E86EA2 -:1081200009F2CAFFFC8F0A7208C0686E09F2CAFF22 -:10813000FC8F0A7208F009141FBB1958085C29C08B -:1081400074FACCFFC0406AF80A0B02C138FB1A006F -:108150003CEDBA0001C072FACCFFC0406AF80A0BCD -:1081600001C088A19AC092FACAFFC04069F4090B05 -:108170000C406A2FFA506AFACAFFC0406C180A50C5 -:108180004A1A9CCF4A6E0C780CFACBFFC0406AF6B4 -:108190000A0B0C6E0C2FCC8F0CC108FACCFFC04020 -:1081A0006AF80A0B04406A2FFA506AF60C1518C0D8 -:1081B00080FACCFFC0F80A0B0B406B2FFB506B40D2 -:1081C000EB406C181B409C181B407C181B40AC18E3 -:1081D0001B408C181B40B31623FB1C003CA39CC007 -:1081E00073320A069B1A9CC40CFE90FDD4406AFAB6 -:1081F000CBFFC01A9CE0A003F7FE9100F9F2001338 -:1082000002F1EC5604009100008001009200010090 -:10821000003607010D02F1EC56030000000100FDDD -:10822000CC330A409B1A9CC32CFE90FDC6407A407A -:108230004B1A9CE0A003EAFE91FDBF330A40AB1A43 -:108240009CC25CFE90FDB9408A404B407C180B1AE2 -:108250009CE0A003DBFE91FDB0330A40BB1A9CC139 -:108260006CFE90FDAAFB1C003CA39CFE92FD8E328E -:108270000A069B1A9CC0BCFE91FD88FE9FFD9D8056 -:1082800001B3448001B3548001B2E0D4A118971621 -:10829000963005C0282FF50C35C094301AFACBFF64 -:1082A000F90E9CE0A003B2CF70D8AADAAA0000D4DD -:1082B00031189016957853E04B006FC0313082C072 -:1082C00088169CA5BCE04C007830A2F9B2001033AF -:1082D000C4A10A14961697E0450064C040E045002A -:1082E00069C071580A5C2BC0445C375C365C175817 -:1082F000065C27C0F160DC580CC0C15882C3B1E1F4 -:108300001C003CA58CC37233B4330CE76C003BC338 -:1083100028E8C1000120140C9A0E9B0498E409007F -:10832000ADBD001302F1EC56040092000080010084 -:10833000930001000089BC010D02F1EC560300001E -:10834000000100141FE0A08E452D085C58E0480095 -:108350003AC045EACCFF5118080601A2880C9A0ED3 -:108360009B0498E409141FE0A08E341496169758C5 -:108370000A5C2BC040604C023CCDE35882C0D1E186 -:108380001C003CA58CC092038CE04C0030C05020F7 -:1083900014330CE6040B0CE80B113C817B080381C1 -:1083A0004360DC183BC094182B819BE11C003CA56A -:1083B000CCE15C003CD83A580CC117E11C003CE20F -:1083C0001C0014590CC0B160EA606C181A609C184B -:1083D0001AF40B01045814C0258194D83AD70380AD -:1083E00001AF8C8001AF8CD431149616971893305E -:1083F000043005EA154024C158EDB30000C0920CCA -:108400009A0E9B08980A99E0A051C914961697A154 -:1084100053089A0A9B08980A99E0A051C014941630 -:10842000955803CEB10C9A0E9BD832D43120DD186A -:10843000921693FAC6FFF4B90AFAEB00040695A562 -:10844000B5361700C74E001302F1EC560400930036 -:108450000080010094000100009D94010D02F1ECE8 -:10846000560300000001000E35C0C078DC580CC077 -:1084700037306CC068C061E0450067C031301C8592 -:10848000DC049B1A9CE0A08A61189A39F90609E07D -:108490006BC128EA1B80013038582CC0E18578591F -:1084A000A9F7BB02FC644A1498303C173910C92064 -:1084B0001CE080016ECFBB581CC105857859A9F717 -:1084C000BB03F8F7BB02F4644A1498303C17391028 -:1084D000C9201CE080015DCFBB33040E35C111649F -:1084E0004CB884644C2FFC854CF8CBFFFF854B0EB9 -:1084F00033378BF9BB0158B88B646C2FEC856C5803 -:108500000AC0513007300CBA0CC3B9FAC0FFF330BF -:108510000830090E35E081009164D75807F7B70796 -:10852000FFF9B706215C87EEC1FFFFA504FAEA0058 -:1085300004E0A051EFC032EE158000FAE500049A85 -:108540000B204BBA0B300CFB6C000C2FF6C0282F05 -:10855000965811C2F5FAEA000430183009E0A0512B -:10856000D7C28331CBFACC0092FB001302F1EC5658 -:1085700004009400008001009500010000F72C0128 -:108580000D02F1EC56030000000100FFFCE0A07EAC -:10859000A7FAEA0004E0A051FA189520715811C01A -:1085A000B5E0A0520E14981699FAEA0004E0A04F24 -:1085B000D1FAEB00042F96307CC058F7D5C0040CDC -:1085C000FBA5455815C035201CCF97201CCD363053 -:1085D0000B0CFBCFCB0C20FAC6FFF30E30E00717D5 -:1085E000505C87C3460037C094FACCFFF40E0C19D8 -:1085F0009C588CC03530FCC028300C0E9BC0282005 -:1086000017201BFACAFFF4160A1599F8091800CFAB -:108610008058FCC041F2CCFFFFB49C580BC06720CF -:10862000162FF79A0B2FCBBA0B5C870E9CC0D8EC99 -:108630000C070A2D0A5C5AE04A003AC045E6C9FF19 -:108640003A120AEC0C0B0A201CCF3764DC580CE001 -:108650008700AAEECC000185DCCA58FAEA0004BF04 -:10866000DBFAEB00049A0BE06C7597B93BE07C8673 -:10867000A0F60C0C0ABA0AF9DAB010F80C1107E0EF -:108680006993A4EA198000581CC05500A9D60013AC -:1086900002F1EC56040095000080010096000100F4 -:1086A0000062E7010D02F1EC56030000000100FA40 -:1086B000EA00045D19C0D85C3C300A300BEA1B3F6D -:1086C000F05D1914981699FAEA0004E0A050DAFA5D -:1086D000EB000436610235C0419A062F66C028308F -:1086E0006664DC18065946F9B60413330CFB6C00BB -:1086F0000CFAC7FFF35816C2B5FAEA0004E0A0511D -:108700005418992F87308C30ABF20B0D0A1499F660 -:10871000C8FFD00EF8201CCF812F8720865816CE98 -:10872000B5FAEA0004E0A05140E0A051691498169F -:1087300099FAEA0004E0A04F1F3008E069D784EA04 -:10874000194197E0A05061FAEB0004CD7B0E20FAAE -:10875000C6FFF3C06820109A0B201BBA0B2FF60D32 -:108760008C083CCF900235C0419A072FF7C048E0F3 -:108770004500655F0764DC18075C870E30E007176B -:10878000505C87C2260037C084EC07070CE04C0021 -:1087900035C035339CC028330C0E9BC028201720D1 -:1087A0001BEC0B0709F8091800CFA0E04C003900BA -:1087B000D858001302F1EC56040096000080010026 -:1087C0009700010000DD5C010D02F1EC5603000092 -:1087D000000100C051F2CCFFFFEC0B0B0C580BC09A -:1087E0006720162FF79A0B2FFBBA0B9A08F3D7B016 -:1087F000100C9A069B049CC1AC2F3DD83AD703803D -:1088000001A8E0800138A8800138A480019250803E -:108810000138FE80013932800137D0800138F6807E -:1088200001394C800134C480013756D431203D18C1 -:108830009316971496109C66D85819C0643019E0A6 -:10884000663FF6EA168000A5BB330232EE366A14A4 -:108850003BC0B03674083BE08100995BCCE08500FA -:108860009B103CE08400982FFC143BC0C0E71B0029 -:108870003CA58BC0431039F20817505C8C1818F9CE -:10888000B80600664A667714075C8C581CC2E4AED2 -:1088900082667B2FFB877B5818C054E71B003CA5E2 -:1088A0008BC072667BF40B0B0E667B2FFB877BF80D -:1088B0000B11001638C034109C5C3C5C8CF80B111A -:1088C0000087AB18081238F00917505C89878912A5 -:1088D0009B667C00EFAD001302F1EC56040097009C -:1088E0000080010098000100004AB7010D02F1EC80 -:1088F00056030000000100180A149E5809C0500DCC -:108900003C201B1CCCCFD1102987B9CC38F80919D1 -:1089100000C1D4129B0E945809C0500D3A201B0878 -:10892000CACFD1667B120B877B182987A95818C03C -:1089300054E71C003CA58CC082664C667BF80B0B90 -:108940000E668C2FFC878C87B8CA48189A0C9B0E31 -:1089500092580CC0501734201A04C4CFD1667B182B -:108960000B877B18195818C054E71B003CA58BC017 -:1089700082664B667AF60A0B0E667B2FFB877B5C62 -:10898000891238F00917505C891806664B667C1806 -:108990000B129C169E5809C0500D3A201C1CCACFC1 -:1089A000D1667C120C877C102987A9C738E0470064 -:1089B00061C1213707C1481039C064E71B003CA5DD -:1089C0008BF20817202018F9B8060008373657F937 -:1089D000B70145C058E0470041F9B70050664A0D5D -:1089E0003B6674F4040B0B667B2FFB877B5818C027 -:1089F00054E71B003CA58B00E5A9001302F1EC56DF -:108A0000040098000080010099000100000A0C0198 -:108A10000D02F1EC56030000000100C1D2667BF4A8 -:108A20000B0B0E667B2FFB877B5818C15520195CFA -:108A3000891238F00917505C89160A129B14945851 -:108A400009C0500D3E201B08CECFD1667B120B878C -:108A50007B102987A9664B667616060CC7580CC092 -:108A60004632BB0CCBC04832DB0CCB5C3C3004C084 -:108A70008830ABE0A08CECFA040B0A169C2FF45C57 -:108A80008C581CCF745824C064A5B7E0470065C05B -:108A9000210CC25804C0910CC2C09820141A9CF832 -:108AA00004070C2D0C0CCC5814CF94664B667C1824 -:108AB0000B16168786E71C003CE21C0014590CC0FC -:108AC000F1666B667C180B66AC180B668C180B662F -:108AD000BC160C66EB163CC034162C879C2FDDD8D8 -:108AE0003AD7038001B330D4211897783C6E2A5DC1 -:108AF0001A8F3CC0506ECC2FFC8FCCD82A3FFCD8AC -:108B0000220000D421189616951497300CC0282006 -:108B1000175807C0500B3B0C9CCE7F005227001308 -:108B200002F1EC5604009900008001009A00010057 -:108B3000009FC7010D02F1EC56030000000100CFB9 -:108B4000A7D822EBCD4080E0674998EA170000FEE5 -:108B5000B0E9D08F0CE0A08CEF8F1CE3CF80808039 -:108B600001B3F4EBCD40E021FD18971495360CE0ED -:108B7000A07DDC322CE0A07DD9321CE0A07DD6E0C7 -:108B8000660008EA168080301937CA300B0C9CE06A -:108B9000A056CCA36550053019304A1A9B0C9CE0B6 -:108BA000A057B6300CC0780F0BFACAFFFCF40C09C2 -:108BB0002B2FFC59ECC044E0477FFCCF61301937C4 -:108BC0008AFACBFFFC2FC60C9CE0A057A1321CE018 -:108BD000A07DCE322CE0A07DCB360CE0A07DC8C0BD -:108BE00008D703800147E8800149CCD421FEB0ECCE -:108BF000F9E0A0213BE0A081F31897E0664998EAEC -:108C00001600006C1CF915006A294CF92400005864 -:108C100007C080300CE0A08C65F9D5C010FEB0EA2A -:108C200003301B6C0CFEB0ED7F6C0C300BF96B004D -:108C300054301BFEB0ED346C0CF93B0047580B0070 -:108C4000EAB7001302F1EC5604009A00008001001C -:108C50009B00010000207C010D02F1EC5603000096 -:108C6000000100C050301BFEB0EEDEC2782C7C1933 -:108C70008C581CC131E06CC280EA1C8001FEB0EA55 -:108C800067300CFEB0ECF86C0B6C1CFEB0EF2830BB -:108C90000B6C0CFEB0ED78C1186C1C292C988C5C08 -:108CA0008CE0A0859DE0A00991303A6C0B6C1CFE15 -:108CB000B0F0306C0CFEB0EECF5807C0606C1CF901 -:108CC00055006E290CB884FEB0EC92D82AD70380E8 -:108CD0000074A08000DD2880019E9C8001B3A080EC -:108CE000006EE48000755C800078C08000751080A4 -:108CF0000079788001A6788000AE6480007488EBEB -:108D0000CD4080E0674998EA170000301B6E0CFEEA -:108D1000B0ECEC6E0CFEB0ED5FC070304CE0A031FA -:108D2000CD304CE0A01A966E1CF91B006E580BC09B -:108D300081300A6E0BFEB0EFED6E0CFEB0EE8C349F -:108D40006CE0A07D05301BFE7C2400E0A079FC34A3 -:108D50006CE0A07D1FE3CF8080D703800075848006 -:108D6000007670008C1E001302F1EC5604009B008C -:108D7000008001009C000100003454010D02F1EC60 -:108D8000560300000001008000FF548000D0EC80FA -:108D9000007BAC800078F0EBCD40C0201DE067493F -:108DA00098EA1700006E0C301BF96B005930063042 -:108DB0000BBA0B301BFEB0EB8F6E0CFEB0EC8C5878 -:108DC0003CC1409A8B2FFBBA0B301B6E0CFEB0F0EF -:108DD000231896C0B19A8CE04C9C40CEF5E06CC153 -:108DE00038EA1C8001FEB0E9C55806C0519A8CE0F3 -:108DF0004C9C40C225E06C0D34EA1C0000300BF99D -:108E00005B002EF95B0030F95B0034F95B0036F94A -:108E10006B002B78FAB48B78FAB49B300AB91BF844 -:108E2000EB0008F8EB0010F8EB0018F8EB00202D31 -:108E30008CB80BB8ABC058300C6E0B2AABB68C306C -:108E40000B6E0CFEB0EC44300B6E0CFEB0EB446EBF -:108E50000CFEB0EC85581CC0D1E06CC138EA1C8017 -:108E6000012F8CFEB0E986303B6E0CFEB0EC9EC04C -:108E700058301B6E0CFEB0EC99346CE0A07C7A305C -:108E80002BFE7C2400E0A000CCB1001302F1EC56D4 -:108E900004009C00008001009D000100005EEC01C8 -:108EA0000D02F1EC560300000001007971346CE012 -:108EB000A07C94300C6E0B2A7BB68C2FFDE3CF8008 -:108EC000C0D7038000754C80007C8C800075448086 -:108ED00000734C800075D480006FE880007620D449 -:108EE00001FEB0E83D301BFEB0EC3A346CE0A07CF3 -:108EF00053305BFE7C2400E0A0794A346CE0A07C17 -:108F00006DD80A80006DB0800075B0800195E88052 -:108F1000018FE08001962CEBCD4080F80B1518C036 -:108F200030582CC2C1E0670D34EA170000EF3C0056 -:108F30002D582CC0D1301BE06C4998EA1C000078F9 -:108F40000CFEB0EBEFE06C00FFEF6C002D300CEF8F -:108F50005C002EEF5C0030EF5C0032EF6C002B30D9 -:108F60000A300BAF1BEEEB0008EEEB0010EEEB004F -:108F700018EEEB00202D87AE0CAEACE3CF808080E6 -:108F8000007574D421E0670D34EA170000EF1B0070 -:108F90002E169A2FFAEF5A002EEE0B0B0C0F8C2C7C -:108FA0002C5C5CE04C004EF9BC02010011890013FE -:108FB00002F1EC5604009D00008001009E000100BB -:108FC00000CB27010D02F1EC56030000000100FE6A -:108FD0000C001C98CC180F009E0600060006000628 -:108FE00000060000E20600015A01BC06000600056A -:108FF000220600047602EC0326035A038E060003C1 -:10900000D003D00402040204340600060006000661 -:109010000006000600060006000600060006000620 -:109020000006000600060006000600060006000610 -:10903000000600028C04A004BC050C02BC0600065D -:109040000004F606000600060006000600060006FC -:1090500000060006000600060006000600060006E0 -:1090600000060006000600060006000600060006D0 -:10907000000240EF1C002E582CE08102B70F9CEF3D -:109080005C0032EF1C0032581CC065E06C0080EFC1 -:109090006C0028C048370CEF6C0028301BE06C498E -:1090A00098EA1C0000780C2CECB88BEF6B002B308E -:1090B0000C2D27AE0CD82AEF1C002E582CE0810274 -:1090C000950F9CFEB0C92E189B305A3026C2300036 -:1090D000EDCF001302F1EC5604009E000080010069 -:1090E0009F00010000749C010D02F1EC560300008A -:1090F0000001008FFB19BBA96B19CC180BEF5B00AB -:1091000034EF5A0036EF66002CE0644998EA140008 -:1091100000680CFEB0EB50581CC171302B680CFE7F -:10912000B0EB506EFC19ACF9DCC004EF5C003830D9 -:109130000CEF5C003AC0980E9C2C0C8FFC300CEFAE -:109140005C0034EF5A0036EF66002B300C2D27AE52 -:109150000CD82AE0644998EA140000300B680CFE31 -:10916000B0EAE4680CF92B0051581BC041302BF9D0 -:109170006B0051303BEF6B002B3005EF55002EFE9E -:10918000B0EB1A582CE0810243EF1C003A2FFCEFA1 -:109190005C003AEF1C0038EF1B003AF60C1900E0B7 -:1091A000810236303B680CFEB0EB0CEF5500382CDA -:1091B00067AE05D82AEF1C002E582CC265EF1C00A4 -:1091C00032580CC0510F9CEF5C0032C088EF1C007D -:1091D00032EF1B002E163CE081021AEF1C0032EF2A -:1091E0001B002EF80B1900E0810212EF1B0032FE6B -:1091F0003BFF02004336001302F1EC5604009F00CF -:1092000000800100A000010000EBF7010D02F1EC6D -:10921000560300000001005C5B0E9C2FECFEB0C802 -:10922000D5C091370CEF6C0028C098300C2CE7AEFD -:109230000CD82AE06C0080EF6C0028302CE06B49E1 -:1092400098EA1B0000760B2CEBB68C3005EF55002E -:1092500032EF55002E301C2D57AE8CD82A3005E049 -:109260006C1981EA1C00DA8B0CFEB0C00D8FFC304B -:109270001BEF5B00363026EF66002BE0644998EA6E -:10928000140000680CF9660051303AF96A0032EFB8 -:1092900055002E2D37AE8B300BFEB0EA59300A3018 -:1092A0005B306CE0A06254D82AFEB0BFF98FFC306E -:1092B0003BEF5B00363026EF66002BE0644998EA0E -:1092C000140000680CF9660051F96B0032300B2D68 -:1092D00027AE0BFEB0EA3CD82AFEB0C0838FFC302C -:1092E00026EF560036EF66002BE0644998EA14003A -:1092F00000680CF9660051303BF96B0032300B2DE1 -:1093000027AE0BFEB0EA24D82AE06C0080EF6C0098 -:1093100028301CEF6C002B00E5A8001302F1EC567E -:109320000400A00000800100A100010000574601D8 -:109330000D02F1EC56030000000100E0644998EAD8 -:10934000140000680C302BF96B0032301BFEB0EAC1 -:1093500053300B680CFEB0E94B300CE0A089523062 -:109360000C2D27AE0CD82AE06C0080EF6C00283062 -:109370001CEF6C002BE0644998EA140000680C3084 -:109380002BF96B0032301BFEB0EA36301B680CFE46 -:10939000B0E92E300C2D27AE0CD82AE06C0080EFFF -:1093A0006C0028301CEF6C002BE0644998EA140034 -:1093B00000680C302BF96B003230052D5CB885301D -:1093C0000A305B306CE0A061D52D27AE05D82AE0CD -:1093D0006C0080EF6C0028301BEF6B002BE06449C1 -:1093E00098EA140000680C302AF96A0032F96B0020 -:1093F0002B2D4C198C580CC091300A305B306CE02E -:10940000A0620A301CE0A088FD300C2D27AE0CD8DD -:109410002AE06C0080EF6C0028301CEF6C002BE021 -:10942000644998EA140000680C302BF96B00320F85 -:109430008BE04B00D65F0B2D4CB88B0066A200135F -:1094400002F1EC560400A10000800100A20001001E -:1094500000C28D010D02F1EC560300000001003046 -:109460000C2D27AE0CD82AE06C0080EF6C00283061 -:109470001CEF6C002BE0644998EA140000680C3083 -:109480002BF96B00320F8BE04B00D95F0B2D3CB8F2 -:109490008B300C2D27AE0CD82AE06C0080EF6C00CE -:1094A00028301CEF6C002B302CE06B4998EA1B0035 -:1094B00000760B2CEBB68CE06C3F20EA1C000078A9 -:1094C0006CF90B0028581BCB35300B2D8CB80B30AA -:1094D0000A304B306CE0A061B1CAABE06C0080EFA9 -:1094E0006C0028301CEF6C002BE0644998EA1400F3 -:1094F00000680C302BF96B0032FEB0EC63300C2DA1 -:1095000027AE0CD82AEF1C002E585CE08100B60E66 -:109510009C2FFCFEB0BEF6C0F1370CEF6C0028C0EB -:10952000F8EF1C002E583CE08100A80E9C2FFCFE9A -:10953000B0BF00CF30E06C0080EF6C0028302CE032 -:109540006B4998EA1B0000760B2CEBB68C301CEFB5 -:109550006C002B300C2D27AE0CD82AEF1C002E00EF -:109560000897001302F1EC560400A20000800100ED -:10957000A3000100007D36010D02F1EC560300004E -:10958000000100582CE081008B0E9C2FFCFEB0BF28 -:1095900011CE41CD5BEF1C002E582CE08100800ED7 -:1095A0009C2FFCFEB0BF28CD91CCABFEB0BFF4C267 -:1095B000F0E02C00C4C0A0204CC040207CC140C1C1 -:1095C000C8FEB0C6EF8FFCC1F8FEB0BFF18FFC192A -:1095D0008B580BC041E06B00C4B88B6EFC199CEF3C -:1095E0005C0034C118E06C00CF6EFBB68CFEB0BFDF -:1095F000B96EFBB69CC088E06C00C46EFBB68C30C4 -:109600000C6EFBB69C303CEF6C002CC0B8E06C00DC -:10961000CF6EFBB68C355C6EFBB69C303CEF6C00BD -:109620002C6EFC199B580BC0D1302CE06B4998EA8A -:109630001B0000760B2AFBB68C300CEF5C0034C0AC -:10964000D8198CE04C00CFCF10301CE06B4998EA61 -:109650001B0000760B2AFBB68C3026EF5600363006 -:109660000CEF5C002E2D57AE86E0644998EA14009A -:1096700000301B680CFEB0E8F9300B680CFEB0E857 -:109680009D300C0067C1001302F1EC560400A300EA -:1096900000800100A400010000691E010D02F1EC30 -:1096A00056030000000100FEB0BF76D82A370CEF49 -:1096B0006C0028301CEF6C002B300C2D27AE0CD822 -:1096C0002AD70380003150800075C0800075CC809F -:1096D0000031B08000206C80002084800021C88090 -:1096E0000075B8800073B0800165348001B3C48018 -:1096F0000165D880007B60800020A0800020D080A1 -:1097000000212C80002170800023108000311C80FB -:10971000002328800022DC800075E4800022ECEB2E -:10972000CD40C03006E0670D34EA170000EF3C0082 -:109730002B581CC051311CEF6C002BC108EF3C00B2 -:109740002B582CC051312CEF6C002BC088EF3C0003 -:109750002B583CC041313CEF6C002BEF3C002B21DF -:109760001CC060201CC1C0201CC580C998EF3600F9 -:1097700028321CEF6C002BE06C4998EA1C00007842 -:109780000CF93B0032582BE0810090303B2CECB8B8 -:109790008B300C6EFBB68C6EFBB69CC868EF1C0061 -:1097A00036581CC375EF1C00C2BA001302F1EC5608 -:1097B0000400A40000800100A50001000003A60130 -:1097C0000D02F1EC560300000001000030EF1B0019 -:1097D00036F60C1900C7B26EFCEF1B0030F80B0711 -:1097E00006EF1C00302FFCEF5C0030EF1B0036F65C -:1097F0000C1900C6C1300CEF5C0030EF5C00363253 -:109800003CEF6C002BE06C4998EA1C0000780C2AB5 -:10981000FCF92B0000582BC5A1301BE06C4998EADD -:109820001C0000780CFEB0E7ED300C6EFBB68C6EC1 -:10983000FBB69CC4C8323C2D57AE8CC488EF1C00CC -:1098400030EF1B0034F60C1900C412EF3C002C580A -:109850002CC1216EFBEF1C0030180B17D6E06C49B1 -:1098600098EA1C0000780CFEB0E7E8C0E1302CEF6D -:109870006C002DC0A8EF3C002C583CC0616EFBEF83 -:109880001C0030180B17A6EF1C00302FFCEF5C00FB -:1098900030EF1B0034F60C1900C191300CEF5C0066 -:1098A00030EF5C0034323CEF6C002BE06C4998EAFE -:1098B0001C0000780C2AFCF92B0000582BC071CA40 -:1098C000DB300CEF5C00302CC7AE0C00DD7F0013EA -:1098D00002F1EC560400A50000800100A600010082 -:1098E00000966D010D02F1EC560300000001000C22 -:1098F0009C5C5CE3CD80C0800075348000756C207A -:109900002DE06BC260EA1B8001B70ABB1BF92B007C -:10991000005C5BC090201BE0800101201BE0800107 -:10992000C0E08F02A2E06B27B8EA1B0000760B288C -:109930002B178B588BF9BB02001E0BF73B000AFE5E -:109940000B001F061D36516A859EB9782BF92A0037 -:1099500004F60A041BBA0B782BF92A0004F60A0055 -:109960001B2ECB960BBA1B782BF92A0004F60A00A3 -:109970001B2D8B960BBA2BCB98782BF92A0004F66B -:109980000A001B2ECB960BBA0B782BF92A0004F693 -:109990000A041BF60B11FFBA1B782BF92A0004F6F8 -:1099A0000A001B2D8B960BBA2BCA08782BF92A00BC -:1099B00004F60A041BF60B11FFBA0B782BF92A00E8 -:1099C00004F60A001B2ECB960BF60B11FFBA1B7880 -:1099D0002BF92A0004F60A001B2D8B960BBA2BC814 -:1099E00058782BF92A0004F60A001B2ECB960B00A0 -:1099F000F035001302F1EC560400A60000800100CF -:109A0000A70001000029D6010D02F1EC5603000069 -:109A1000000100F60B11FFBA0B782BF92A0004F6AF -:109A20000A041BBA1B782BF92A0004F60A001B2D26 -:109A30008B960BBA2BC6C8782BF92A0004F60A04B9 -:109A40001BF60B11FFBA0B782BF92A0004F60A005B -:109A50001B2ECB960BBA1B782BF92A0004F60A00B2 -:109A60001B2D8B960BF60B11FFBA2BC518782BF913 -:109A70002A0004F60A001B2ECB960BBA0B782BF9A2 -:109A80002A0004F60A041BBA1B782BF92A0004F6F4 -:109A90000A001B2D8B960BF60B11FFBA2BC388788F -:109AA0002BF92A0004F60A041BBA0B782BF92A00BA -:109AB00004F60A001B2ECB960BF60B11FFBA1B788F -:109AC0002BF92A0004F60A001B2D8B960BF60B11BE -:109AD000FFBA2BC1D8782BF92A0004F60A001B2EF6 -:109AE000CB960BF60B11FFBA0B782BF92A0004F674 -:109AF0000A041BF60B11FFBA1B782BF92A0004F697 -:109B00000A001B2D8B960BF60B11FFBA2B9A0B78C4 -:109B10002AF929001755001302F1EC560400A7009A -:109B200000800100A800010000BE3D010D02F1EC23 -:109B3000560300000001000004F4090A1B9A1B7878 -:109B40002AF9290004F409001A2ECAB40B9A2B78BA -:109B50002A2FCCF9290000F409001A2D8AB40BCA67 -:109B600079E06B27B8EA1B0000760B281B178B588F -:109B70008BF9BB02002FEBFE0B001FC0CBC078C1DE -:109B8000E8C368C4D8C658C7C8C948782BF92A00A2 -:109B900004F60A001B2ECB960BBA0B782BF92A0081 -:109BA00004F60A041B5C3BBA1B782BF92A0004F666 -:109BB0000A001B2D8B960BBA2BCBCB782BF92A00E6 -:109BC00004F60A041B5C3BBA0B782BF92A0004F656 -:109BD0000A001B2ECB960B5C3BBA1B782BF92A0094 -:109BE00004F60A001B2D8B960BBA2BCA3B782BF977 -:109BF0002A0004F60A001B2ECB960B5C3BBA0B78AE -:109C00002BF92A0004F60A041BBA1B782BF92A0048 -:109C100004F60A001B2D8B960BBA2BC8BB782BF9C8 -:109C20002A0004F60A041B5C3BBA0B782BF92A00C5 -:109C300004F60A001B2ECB001CA3001302F1EC5605 -:109C40000400A80000800100A900010000FE8601B8 -:109C50000D02F1EC56030000000100960BBA1B78D0 -:109C60002BF92A0004F60A001B2D8B960B5C3BBADD -:109C70002BC72B782BF92A0004F60A001B2ECB9653 -:109C80000BBA0B782BF92A0004F60A041BBA1B78CE -:109C90002BF92A0004F60A001B2D8B960B5C3BBAAD -:109CA0002BC5AB782BF92A0004F60A041BBA0B78F3 -:109CB0002BF92A0004F60A001B2ECB960B5C3BBA4C -:109CC0001B782BF92A0004F60A001B2D8B960B5CDF -:109CD0003BBA2BC41B782BF92A0004F60A001B2E72 -:109CE000CB960B5C3BBA0B782BF92A0004F60A04DE -:109CF0001B5C3BBA1B782BF92A0004F60A001B2DCB -:109D00008B960B5C3BBA2BC27BE06B27B8EA1B003F -:109D100000760BF73B0080588BF9BB02001E0BF757 -:109D20003B000AFE0B001F061C334B627A91A97898 -:109D30002BF92A0004F60A041BBA0B782BF92A0027 -:109D400004F60A001B965BBA1B782BF92A0004F66E -:109D50000A001B2ECB960BBA2BCA6800D17D0013CC -:109D600002F1EC560400A90000800100AA000100E5 -:109D7000006B4D010D02F1EC56030000000100786C -:109D80002BF92A0004F60A001B965BBA0B782BF914 -:109D90002A0004F60A041B5C3BBA1B782BF92A0044 -:109DA00004F60A001B2ECB960BBA2BC8F8782BF9B9 -:109DB0002A0004F60A041B5C3BBA0B782BF92A0034 -:109DC00004F60A001B965B5C3BBA1B782BF92A0051 -:109DD00004F60A001B2ECB960BBA2BC778782BF90A -:109DE0002A0004F60A001B965B5C3BBA0B782BF941 -:109DF0002A0004F60A041BBA1B782BF92A0004F681 -:109E00000A001B2ECB960BBA2BC608782BF92A001A -:109E100004F60A041B5C3BBA0B782BF92A0004F603 -:109E20000A001B965BBA1B782BF92A0004F60A007D -:109E30001B2ECB960B5C3BBA2BC488782BF92A00DF -:109E400004F60A001B965BBA0B782BF92A0004F67D -:109E50000A041BBA1B782BF92A0004F60A001B2EF1 -:109E6000CB960B5C3BBA2BC318782BF92A0004F66F -:109E70000A041BBA0B782BF92A0004F60A001B000F -:109E8000D464001302F1EC560400AA000080010023 -:109E9000AB00010000D4F6010D02F1EC5603000006 -:109EA000000100965B5C3BBA1B782BF92A0004F694 -:109EB0000A001B2ECB960B5C3BBA2BC198782BF972 -:109EC0002A0004F60A001B965B5C3BBA0B782BF960 -:109ED0002A0004F60A041B5C3BBA1B782BF92A0003 -:109EE00004F60A001B2ECB960B5C3BBA2B9A0B7820 -:109EF0002AF9290004F4090A1B9A1B782AF9290077 -:109F000004F409001AB45B9A2B782A2FCCF92900A3 -:109F100000F409001A2ECAB40B2FED5EFF0000EB0F -:109F2000CD40FC204D1897E06CC0F8EA1C8001B9C8 -:109F30000ABB1B2F8CB90AFAEB0008EF2C00005C5F -:109F40005C589CF9BC02042FECFE0C001FC098C5A5 -:109F500098CF68CD18C499C489C9D8C119C3896E6E -:109F60002CEF2B0004F80B041CBA0C6E2CEF2B000A -:109F700004F80B001C2ECC980CBA1C6E2B2FC7EFCC -:109F80002A0000F60A001B2D8B960BBA2B9A0ABAF0 -:109F90004ABA5CBA6B300CC0F8F80B1501FACAFF6C -:109FA000F8160A004504001302F1EC560400AB0059 -:109FB00000800100AC00010000C0DE010D02F1ECE8 -:109FC00056030000000100948AE04A8001C0451A4F -:109FD00099F20B0A0A2FFC5C5C583CCF15E06C2709 -:109FE000B8EA1C000078069A0CE0A0350BE06BF68E -:109FF00060EA1B3A1CE0A033258D0C9A1CE0A035CA -:10A0000001E06BF660EA1B3A1CE0A0331B8D1C9A42 -:10A010002CE0A034F7E06BF660EA1B3A1CE0A033BA -:10A02000118D2CCF486E2CEF2B0004F80B041CBABA -:10A030000C6E2CEF2B0004F80B001C2ECC9805BAEC -:10A04000156E2C2FC7EF2B0000F80B001C2D8C98E1 -:10A0500007BA27E06C27B8EA1C00007806E0629691 -:10A06000A6EA121DA1E063044FEA133F349A0CE004 -:10A07000A034C8E0A045DE04980699E0A04551E070 -:10A08000A034188D3C0A9CE0A034BCE0A045D2046A -:10A09000980699E0A04545E0A0340C8D4C0E9CE05C -:10A0A000A034B0E0A045C604980699E0A04539E088 -:10A0B000A034008D5CCAB8E06C27B8EA1C000078B8 -:10A0C00006E064147BEA14006DA8001302F1EC565C -:10A0D0000400AC0000800100AD00010000AA660190 -:10A0E0000D02F1EC5603000000010047AEE0657A76 -:10A0F000E1EA153F846E2CEF2B0004F80B041CE002 -:10A10000A03492E0A045A808980A99E0A0451BE079 -:10A11000A033E28DFC6E2C2FC7EF2B0000F80B0054 -:10A120001C985CE0A03480E0A0459608980A99E06D -:10A13000A04509E0A033D0ED4C0040C7A8E06C2753 -:10A14000B8EA1C000078066E2CEF2B0004F80B0414 -:10A150001CA96CE0A034688DCC6E2C2FC7EF2B00AF -:10A1600000F80B001C985CE0A0345E6CCBE0A032E1 -:10A17000258DCC6CCBE06CD70AEA1C3C23E0A032E6 -:10A18000738DCCC568E06C27B8EA1C000078066EB9 -:10A190002CEF2B0004F80B041CED5C004A6E2CEF36 -:10A1A0002B0004F80B001C2ECC980CED5C004C6EC0 -:10A1B0002C2FC7EF2B0000F80B001C2D8C980C2BBC -:10A1C00026AC0CC368E06C27B8EA1C000078066E69 -:10A1D0002CEF2B0004F80B041CED5C00506E2CEFF0 -:10A1E0002B0004F80B001C985CED5C00DD7900137B -:10A1F00002F1EC560400AD0000800100AE00010049 -:10A20000003FAD010D02F1EC56030000000100001B -:10A21000526E2CEF2B0004F80B001C2ECC980CED8A -:10A220005C00546E2C2FC7EF2B0000F80B001C2E87 -:10A230002C980C2AA6AC0CC0E86E2C2FC7EF2B0074 -:10A2400000F80B041CE06B27B8EA1B0000760B2A11 -:10A250008BB60C2FCDE3CF90FCD7038001386880FC -:10A26000013756800114E880011638800111CC8036 -:10A27000011278EBCD40E021AD300CBA9CBA8CBA1B -:10A280009CC1180E9CFEB0FBCD5826C0410E9CE030 -:10A29000A025965825C0310E9CC79EFB2B00012F90 -:10A2A000FBBA9BFB2B000158ABE0840153FB2B0056 -:10A2B00001585BCF40FB2B0001589BCF00E06C3F67 -:10A2C00020EA1C0000FB2A0001F80A0327EF0C001B -:10A2D00024580CC0D4E06C27B8EA1C0000780C2984 -:10A2E0002C988CEF0B0024180BEF5B0024300B0E26 -:10A2F0009C6ECA746A5D1A1896301B0E9C6ECA74E6 -:10A300006A5D1A18955816C0305815C081EF2C0098 -:10A310008A08001302F1EC560400AE000080010030 -:10A32000AF000100008016010D02F1EC56030000A1 -:10A3300000010000265C5C6EBB764B5D1BCC1B589D -:10A3400026C0305825CBD1306BFACCFFD46EBA740E -:10A350005A5D1ACB60EF2C00042FFCAECCEF2C0022 -:10A3600004EF3B000CF60C1900C035300CAECC30BD -:10A370000CBA8CC298FACCFFD4FB2A0000F80A076A -:10A380001BA96BFB290000F809001C199C180BFA8B -:10A39000CCFFCCFB290000F8090A1BFACCFFCCFB50 -:10A3A0002A0000F80A041C6E2BEF2A0004EF390083 -:10A3B0000CFB2E0000F20E034AF60A0A1CFB2B00CF -:10A3C000002FFBBA8BFB2B0000EF3C0010F80B19A1 -:10A3D00000FE94FF6BFB2B00015C5B589BF9BB02FA -:10A3E000052FEBFE0B001FC098C278C3C8C518C963 -:10A3F00048CD5BCC1BCAB8C9D8FACCFFD4FB2A0025 -:10A4000000F80A001C199BA96BFACCFFD4FB2900A9 -:10A4100000F809071C180BE06C0E80EA1C0000FB1A -:10A42000290000F809041C180BFACCFFCCFB29000A -:10A4300000F80900C1A3001302F1EC560400AF00BC -:10A4400000800100B000010000907E010D02F1ECDF -:10A45000560300000001000A1BCB3BFACCFFD4FBE3 -:10A460002A0000F80A001C199BA96BFACCFFD4FB48 -:10A47000290000F809071C180BFACCFFCCFB2900B7 -:10A4800000F8090A1BC9DBFACCFFD4FB2A0000F84C -:10A490000A001C199BA96BFACCFFD4FB290000F819 -:10A4A00009071C180BFACCFFCCFB290000F8090A9D -:10A4B0001BC87BFB2B0000580BC161FACCFFD4FBFF -:10A4C0002A0000F80A070BA96BFACAFFD4FB2C007C -:10A4D00000180A159C180BFACCFFCCFB290000F8D9 -:10A4E000090A1BC6EBFB2B0000581BC0E1FACBFF8F -:10A4F000D4FB2C0000180B179CFACBFFCCFB2900D7 -:10A5000000F6090A1CC5DBFB2B0000582BFE91FF4F -:10A5100059FACBFFD4FB2C0000180B179BA96BFA40 -:10A52000CAFFD4FB2C0000180A15AC180BFACCFF9C -:10A53000CCFB290000F8090A1BC43BFACCFFD4FB72 -:10A540002A0000F80A070CFACBFFCCFB290000F622 -:10A55000090A1CC36BFACC00D24C001302F1EC5672 -:10A560000400B00000800100B10001000084C301BC -:10A570000D02F1EC56030000000100FFD4FB2A009D -:10A5800000F80A070CFACBFFCCFB290000F6090AF9 -:10A590001CC29BFACCFFD4FB2A0000F80A071BA9B7 -:10A5A0006BFB290000F809001C199C180BFACCFF62 -:10A5B000CCFB290000F8090A1BC15BE06727B8EA59 -:10A5C0001700006E0CF91B005E580BC050292C9828 -:10A5D0008CE0A081616E0C798B580BC1E0300BFBD5 -:10A5E0005B0064FB6B003D30AAFB6A003EFB6B0026 -:10A5F00040FB6B0041302BFB6B003C292C988CFB03 -:10A600005C0064FACCFFC41A9B32C9190A16AA204E -:10A6100049CFD1E0A0511E2E6DE3CF90E0D703804B -:10A6200000F9AC8001B418800153D4EBCD408030E8 -:10A630003A300B300CE0A0504D582CC041302CE388 -:10A64000CD8080E06CC148EA1C8001FEB0DF0C3098 -:10A650000CE0672BC4EA170000EF6C0071EF5C00A0 -:10A6600072FB3A000EFB3B000DFB3C000CE0A00728 -:10A6700051300A300B0E9930ACB32A00C8E10013F8 -:10A6800002F1EC560400B10000800100B2000100AC -:10A69000001108010D02F1EC56030000000100203A -:10A6A0001CCFE1930AE3CF9080D70380006FE8804E -:10A6B00000C0945EFF0000EBCD40E020EDFACCFF3F -:10A6C000F4E0A05093303B303CE0A050C3C041FCCC -:10A6D0001C447A50BCE0672BC4EA1700006FDC29E9 -:10A6E000ECF92500005C75F9D5B008E0A05A3E18D9 -:10A6F00096E0A006D3EF6C006CEF2C006C582CC0D9 -:10A70000815825C061301B303CE0A05075C098587E -:10A710001CC0715815C051302B303CE0A0506CFA71 -:10A72000CCFFF4780A500A781A501A782A502AF77F -:10A73000D6C01040BCE0A0064328876E0C0C0C8FDE -:10A740000C2F2DE3CF90E080015348800153B0805F -:10A750000166C88000BFF8800153548000BF1CEB25 -:10A76000CD4080202DE0672BC4EA170000EF2C00BD -:10A7700054580CC4551A9CE0A07FEC0E9C2ACC1AAD -:10A780009B3069172A18BA2029CFD1EF2C0055EF3A -:10A790002B006EF60C1800C291EF2B0070EF2A0010 -:10A7A0002470001302F1EC560400B2000080010096 -:10A7B000B300010000AEB3010D02F1EC560300003E -:10A7C000000100006E160AEF6A006EEF2B006EE0CB -:10A7D0004B003DC065EF2B006E23CBEF6B006E305E -:10A7E0000BEF4B007829B7EF2B00005BFBC051301B -:10A7F0001C2FEDE3CD8080161CE0A042FEBFDBE005 -:10A80000A042E15C6C581CCF44300CCF3BEF2B00D6 -:10A810005DF60C1800CFA0EEEA00542A47AF1BCF1C -:10A820005B6FECE06B7740EA1B001B163CCEE5CE7D -:10A830000B0000EBCD40FC3007C0682926ED2C0052 -:10A84000000A0CAC8CE0662BC4EA160000ED240074 -:10A850006E5C675807C1D5ED27005508175C67ED9A -:10A860002500705807CEB4F9D7B008E0A042C5BFA4 -:10A87000DB149216930A9CE0A042BF04980699E06C -:10A88000A04276CE1208252926AC853007CDCBE034 -:10A8900044003DC0652926ED2C000023CCAC8CE3A0 -:10A8A000CF80FC80013932EBCD4080E0672BC4EAD9 -:10A8B000170000301CEF6C006C300CEF6C006D3F2B -:10A8C000FBEF6B005D48001302F1EC560400B3008F -:10A8D00000800100B400010000BA9B010D02F1EC00 -:10A8E00056030000000100005430FBEF6B006F3195 -:10A8F0004BEF6B0070EF6C0071EF5C0072E0A07FBB -:10A90000E9EF4C0074E06BB1B0EA1B8000F94B003A -:10A9100068E06BB214EA1B8000F94B006CE06BB28C -:10A9200018EA1B8000F94B0070E06BB464EA1B80EE -:10A9300000F94B0074E06BB8A8EA1B8000F94B00EB -:10A9400078E3CF9080D7038001B3E8D42122AD18FB -:10A95000943006E0672BC4EA1700006FDC29FC196D -:10A960008C580CC051300CEF4C0078C708FACCFF63 -:10A97000ACE0A005BF0E9C1A9B3549190A16AA2007 -:10A9800049CFD1300B301CC96C1895423C6EEBE0BE -:10A99000A02E24E0A041DE3008FC194024E0A041B4 -:10A9A00050E0A04222FB1A009AEF1B0046142B5CD9 -:10A9B00064C1B15805C0515C7CC0315C5BC02030C3 -:10A9C00016300CEF4C00783FFCEF6C0054EEEA00C0 -:10A9D00054EEEB005CEEEA0054EEEB0064EF2C006A -:10A9E0006FEF6C006EC1D8007389001302F1EC5652 -:10A9F0000400B40000800100B500010000D0230174 -:10AA00000D02F1EC56030000000100C0EDC1403022 -:10AA10000CEF6C006DEEEA0054EEEB005C1A9CE06B -:10AA2000A07ECE0E9C2ACC1A9B3069172A18BA2019 -:10AA300029CFD1C24FCCBEC060EEEA0054EEEB008D -:10AA4000643016EF3C0071581CC0C1EF1C007258F6 -:10AA50000CC0313016C068300CEF6C0071EF5C0038 -:10AA6000725C665816C041300CEF4C00780C9C2D7F -:10AA70006DD8228001B2B0EBCD4080300CE06B2B62 -:10AA8000C4EA1B0000F74C0078303A303BE0A04E9F -:10AA9000691897C0EC0E9CE3CD8080D401303A3029 -:10AAA0003B301CE0A04E5ED802D70380015254D444 -:10AAB00001215D1A9CE0A0052F1A9BE06A2BC4EAD5 -:10AAC0001A0000149E30ACB709BD28201CCFD176E7 -:10AAD000089D082EBDDA0AEBCD40C0215D189630E6 -:10AAE00007581BC0F1E0A005FF418B163CC0534145 -:10AAF0008718275C57C8A8280C418718275C57C8B7 -:10AB0000581A9CE0A005085C5658A600086D001372 -:10AB100002F1EC560400B50000800100B60001000F -:10AB20000045E8010D02F1EC56030000000100F9B8 -:10AB3000B602001E06ED36000AFE06001F7A07194F -:10AB400027350743515F6D400C418B163CC0534085 -:10AB50000C41871827C6C8400BE06C9680EA1C00A1 -:10AB600098180B418716272FF7C628401B41970ED0 -:10AB70003BC0331627C5C8E06C9680EA1C009818C5 -:10AB80000B16272FF7C548402B41A70E3BC03316A5 -:10AB900027C4E8E06C9680EA1C0098180B16272F53 -:10ABA000F7C468403B41B70E3BC0331627C408E0EA -:10ABB0006C9680EA1C0098180B16272FF7C3884064 -:10ABC0004B41C70E3BC0331627C328E06C9680EA82 -:10ABD0001C0098180B16272FF7C2A8405B41D70E10 -:10ABE0003BC0331627C248E06C9680EA1C009818D8 -:10ABF0000B16272FF7C1C8406B41E70E3BC0331639 -:10AC000027C168E06C9680EA1C0098180B16272F65 -:10AC1000F7C0E8407B41F70E3BC0331627C088E001 -:10AC20006C9680EA1C0098180B16272FF70E9C00D4 -:10AC300018CF001302F1EC560400B60000800100AA -:10AC4000B700010000FA53010D02F1EC56030000B9 -:10AC50000001002EBDE3CD80C0D7038000C1D830F5 -:10AC60001CE06B2BC4EA1B0000293BB68C5EFDE0A8 -:10AC70006C2BC4EA1C0000293C198C5EFC0000D43B -:10AC800001E0A0047DD80A8000C028E06B2BC4EA54 -:10AC90001B0000F75C0072301C28FBB68C5EFD5E6A -:10ACA000FD0000EBCD40C0215D1A9CE0A00458409F -:10ACB0008642070C9C0E9BE0A02F0CC0630C9C0EE0 -:10ACC0009BE0A02CC1C0B8E06C2400EA1C49740EC3 -:10ACD0009BE0A02CB90C9BE0A02D24E0A04070E0EC -:10ACE00068147BEA1847AEE0697AE1EA193F74E03C -:10ACF000A03EC8E0A02EA4E0A040623008FC1940AD -:10AD000059E0A03FD4E0A040A6E0A02F41E0A04041 -:10AD100057E068147BEA1847AEE0697AE1EA193F28 -:10AD200084E0A03FC4E068432DEA18EB1CE06936DC -:10AD3000E2EA193F1AE0A03EA5E0A02E812EBDE375 -:10AD4000CD80C0EBCD40C0215D1A9CE0A00408403E -:10AD5000D64257008DC5001302F1EC560400B7002F -:10AD600000800100B8000100006DB8010D02F1EC97 -:10AD7000560300000001000C9C0E9BE0A02EBCC0FE -:10AD8000630C9C0E9BE0A02C71C0B8E06C2400EA20 -:10AD90001C49740E9BE0A02C690C9BE0A02CD4E015 -:10ADA000A04020E068147BEA1847AEE0697AE1EA47 -:10ADB000193F74E0A03E78E0A02E54E0A04012308D -:10ADC00008FC194059E0A03F84E0A04056E0A02EC6 -:10ADD000F1E0A04007E068147BEA1847AEE0697A2A -:10ADE000E1EA193F84E0A03F74E068432DEA18EBE4 -:10ADF0001CE06936E2EA193F1AE0A03E55E0A02EB9 -:10AE0000312EBDE3CD80C08001157C800110F08023 -:10AE10000111CC800116388001352C800114E8EB3B -:10AE2000CD40FE22AD18971696FACCFFACE0A003F9 -:10AE3000A9301B0D8CF80C1068EE0C0B0BE0612B8D -:10AE4000C4EA110000E33A0071303C581AC1510DB8 -:10AE500089F20910680E09B29C0D89F20910680E7A -:10AE600009B2CB581AC0E1E31B0072580BC0A130E5 -:10AE70000BE36B0071C068008B4D001302F1EC56C0 -:10AE80000400B80000800100B9000100002D03019A -:10AE90000D02F1EC560300000001000D8AF40A10C7 -:10AEA000680E0AB49B0D8BF60B10680E0BB6ACFC4B -:10AEB000134059029C1A9B3549190A16AA2049CFFA -:10AEC000D1300B301CC51E58ACE08200EA300C0DAE -:10AED0008BF60B10680E0BB6DC0D8CF80C10680EA0 -:10AEE0000C19D5029C1A9B3549190A16AA2049CF7C -:10AEF000D1300B302CC39E5C5C18450D8CF80C10C7 -:10AF0000680E0CB8D5029C1A9B3549190A16AA205E -:10AF100049CFD1300B303CC28E0D8BF60B10680E32 -:10AF20000B2F8BB68C029C1A9B3549190A16AA2046 -:10AF300049CFD1300B304CC18E0D8BF60B10680E03 -:10AF40000B2F7BB68C029C1A9B3549190A16AA2036 -:10AF500049CFD1300B305CFEB0FE080D8BF60B10E4 -:10AF6000680E0B2F6BB68C029C1A9B3549190A167A -:10AF7000AA2049CFD1C0BFE0A03F4630080699E0E3 -:10AF8000A03EB9E0A03F8B0D8BF60B10680E0B2E88 -:10AF9000EBB60C423CE0A03F37300800750D0013C3 -:10AFA00002F1EC560400B90000800100BA00010073 -:10AFB00000B8C8010D02F1EC56030000000100FCCE -:10AFC000194024E0A03EA9E0A03F7B0D8BF60B10BA -:10AFD000680E0B2ECBB68CFB1C009A0D8BF60B105B -:10AFE000680E0B2EBBB68C029C1A9B3549190A16AB -:10AFF000AA2049CFD1C8DEE0A03F1830080699E06A -:10B00000A03E8BE0A03F5D0D8BF60B10680E0B2E63 -:10B01000ABB68C425CE0A03F093008FC194024E04C -:10B02000A03E7BE0A03F4D0D8BF60B10680E0B2E63 -:10B030009BB68C029C1A9B3549190A16AA2049CF47 -:10B04000D1300B306CFEB0FDA30D8BF60B10680EEB -:10B050000B2F5BB68C029C1A9B3549190A16AA2045 -:10B0600049CFD1300B307CFEB0FD920D8BF60B102A -:10B07000680E0B2F4BB68C029C1A9B3549190A1689 -:10B08000AA2049CFD1300B308CFEB0FD810D8BF65C -:10B090000B10680E0B2F3BB68C1A9C354A030B180D -:10B0A000AB204ACFD1300B309CFEB0FD710D8BF63A -:10B0B0000B106816072F27AE8C0D8C2FFCAC8C0064 -:10B0C0007500001302F1EC560400BA000080010084 -:10B0D000BB000100000773010D02F1EC56030000F4 -:10B0E000000100CFF8E06C00800D8BF60B10680EAD -:10B0F0000BB6DC029C1A9B3549190A16AA2049CFC7 -:10B10000D1300B302CFEB0FD550D8BF60B10680EB8 -:10B110000B972C029C1A9B3549190A16AA2049CF75 -:10B12000D1300B303CFEB0FD450D8BF60B10680E98 -:10B130000B973C029C1A9B3549190A16AA2049CF45 -:10B14000D1300B304CFEB0FD350D8BF60B10680E78 -:10B150000B974C029C1A9B3549190A16AA2049CF15 -:10B16000D1300B305CFEB0FD250D8BF60B10680E58 -:10B170000B975C029C1A9B3549190A16AA2049CFE5 -:10B18000D1C29EE0A03E6430080699E0A03DD7E021 -:10B19000A03EA50D8BF60B10680E0B97BC423CE051 -:10B1A000A03E563008FC194024E0A03DC8E0A03E77 -:10B1B0009A0D8BF60B10680E0B2D0BB68CFB1C003A -:10B1C0009A0D8BF60B10680E0B2CFBB68C029C1A9A -:10B1D0009B3549190A16AA2049CFD1FEB0FDACE033 -:10B1E000A03E3600158B001302F1EC560400BB00A4 -:10B1F00000800100BC00010000135B010D02F1ECB6 -:10B200005603000000010014941695E0681EB8EA89 -:10B2100018EB85E069B851EA193F9EE0A03E48C1AD -:10B2200023E062999AEA129999E0639999EA133FA7 -:10B23000B9089A0A9B04980699E0A03E3BC03204E4 -:10B24000940695300AFC1B402408980A99E0A03D1A -:10B2500088E0A03E5A0D8BF60B10680E0B2CEBB657 -:10B260000C425CE0A03E063008FC194024E0A03D02 -:10B2700078E0A03E4A0D8BF60B10680E0B2CCBB677 -:10B280008C029C1A9B3549190A16AA2049CFD13045 -:10B290000B306CFEB0FCA00D8BF60B10680E0B97FC -:10B2A0006C029C1A9B3549190A16AA2049CFD13045 -:10B2B0000B307CFEB0FC900D8BF60B10680E0B97DC -:10B2C0007C029C1A9B3549190A16AA2049CFD13015 -:10B2D0000B308CFEB0FC800D8BF60B10680E0B97BC -:10B2E0008C1A9C354A030B18AB204ACFD1300B3057 -:10B2F0009CFEB0FC710D8BF60B106816078F9C0D31 -:10B300008C2FFCAC8CFEB0001C43001302F1EC56F9 -:10B310000400BC0000800100BD0001000079E301D1 -:10B320000D02F1EC56030000000100FC532D6DE30B -:10B33000CF80FE8000C008800138F6800138A480EC -:10B340000138A88001386880013756800138FED462 -:10B3500031E06612A4EA160000ED3C0159EC0C0045 -:10B3600023ED32015AE0420020C191ECFC0464E676 -:10B37000FB0164E0A029D4ED4C0464ECFC0468E615 -:10B38000FB01E4E0A029CCED4C0468ECFC046CE685 -:10B39000FB0264E0A029C4ED4C046C409CE74C0126 -:10B3A00064ECFB0464E6FC0164E0A02A271895ED38 -:10B3B00045046440ACE74C01E4ECFB0468E0A02ADF -:10B3C0001D1894ED44046840BCE74C0264ECFB0497 -:10B3D0006CE0A02A131897ED47046CE0420020C0EF -:10B3E00064ED3C015A2FFCED6C015AED3C015AE032 -:10B3F0004C0020C174E0A02C2118920A9C049BE010 -:10B40000A02AC6E74C02E4089C049BE0A02AC0E7FF -:10B410004C03640E9C049BE0A02ABAE74C03E4C2F0 -:10B4200048FC113FA00A9CE0A03D36000AE700134B -:10B4300002F1EC560400BD0000800100BE000100D6 -:10B4400000EC28010D02F1EC560300000001003071 -:10B45000080299E0A03CA9E0A02B70E74C02E408A8 -:10B460009CE0A03D2B30080299E0A03C9EE0A02B80 -:10B4700065E74C03640E9CE0A03D2030080299E093 -:10B48000A03C93E0A02B5AE74C03E4ED3C01592F7C -:10B49000FCED6C0159ED3C0159E04C0020C04130FD -:10B4A0000CED6C0159D83A80011360D4313002E0C0 -:10B4B0006712A4EA170000EF30015A5820C024D8C0 -:10B4C0003A3001C0382FF22FF10031C4B4EF3C0103 -:10B4D00059F80B1518C04131FC31EBC078201C180D -:10B4E0009B201B580BC0242E0BEE0B0026EE0C00ED -:10B4F00025EAFC0164ECFB0164E0A02923E0A03C08 -:10B50000DDBFDBE0A02B1A1893EAFC01E4ECFB01A1 -:10B51000E4E0A02917E0A03CD1BFDBE0A02B0E188F -:10B5200094EAFC0264ECFB0264E0A0290BE0A03C7E -:10B53000C5BFDBE0A02B0218963015EA153F800648 -:10B540009C0A9BE0A02B44CBF2089C0A9BE0A00045 -:10B550008FD4001302F1EC560400BE0000800100FD -:10B56000BF000100005393010D02F1EC56030000EF -:10B570000001002B3FCBA20C9C0A9BE0A02B3ACBF6 -:10B58000523002CB4B5C525952CAD5DA3A0000EB2A -:10B59000CD40E020DD18971696411C50AC412C5050 -:10B5A000BC413C50CCFACCFFD8780A500A781A50EB -:10B5B0001A782A502ACF1EE06512A4EA150000EB83 -:10B5C0003C0158582CC3F1F7D6C0100E9CE0A018CF -:10B5D000EBF7D6C010FACCFFD8FEB0C88D0A9CFE9F -:10B5E0003CFF30E0A078D8EAFC00D0581CC141E014 -:10B5F000A0580A0A9CFE3CFF30E0A078CD0A9BFED2 -:10B600003BFF30FE35FF580A9A305CB709B5282059 -:10B610001CCFD1C1F80A9CFE3CFF301A9B3289191D -:10B620000A16AA2049CFD1C14DE0A0027BC120EB70 -:10B630001C00DE580CC0E1301CEB6C0158E0A07718 -:10B6400047C088581CC061C44FC040302CEB6C010F -:10B65000582F3DE3CF80E08000F1308000508080A3 -:10B66000016F908001B1208001AE58E06C12A4EA15 -:10B670001C0000007558001302F1EC560400BF00D6 -:10B6800000800100C00001000052FB010D02F1EC3E -:10B6900056030000000100F93C01585EFC00005810 -:10B6A0000C5E0DE06B12A4EA1B0000F6FB01603596 -:10B6B00049170A18AA2049CFD1254C5EFD0000EB9E -:10B6C000CD4080F80A1518C111E06712A4EA1700EE -:10B6D00000169CE0A02AE8EF4C0150FE37FEB40EA5 -:10B6E0009CE0A0785BE3CF8080581CC111E067121A -:10B6F000A4EA170000169CE0A02AD6EF4C014CFEED -:10B7000037FEB40E9CE0A07849E3CF8080582CC06F -:10B71000C1E06712A4EA170000EF5B0154FE37FE98 -:10B72000B40E9CE0A0783AE3CF8080D42116971421 -:10B7300096E06512A4EA150000300A300B0A983032 -:10B74000A9B12A2019CFE1910A0A9BFE3BFB8C305C -:10B75000083009169E30AABD28201ACFE19D080A9C -:10B760009B2ACB169E30AABD28201ACFE19D080A3D -:10B770009AFE3AFB8C0A9B1494305EB709A92820E4 -:10B780001ECFD10A9BFE3BFB8CEB4B01600A9BFE5C -:10B790003BFF0830083009000C82001302F1EC5620 -:10B7A0000400C00000800100C1000100003E5701FC -:10B7B0000D02F1EC56030000000100169E30AABDF8 -:10B7C00028201ACFE19D080A9BFE3BFEB4B71997CB -:10B7D000280A9BFE3BFF30B719F6E90008F6E9009E -:10B7E00010F6E90018F6E900200A9BFE3BFF58B767 -:10B7F00019F6E90008F6E90010F6E90018F6E90084 -:10B8000020E0A02A63EB4C01500E9CE0A02A5EEBE6 -:10B810004C014CEB560154E0A055E80A9CFE3CFE5E -:10B82000B4E0A077CDE06C2710EB5C004AEB5C0045 -:10B830004C3007EB570044EB5700463016EB6601DF -:10B8400058EB670159EB67015A300CEB4C0464EB81 -:10B850004C0468EB4C046CE06C12A0EA1C000099EC -:10B8600007EB470470E0A06F27EB67015BEB660115 -:10B870005CE06CC068EA1C8001FEB0D715D82A8055 -:10B8800001160C80016D2C8001B10080019FF880B1 -:10B89000006FE85EFD0000D42120ADE06712A4EA4D -:10B8A000170000EEF500AC410C0A3CC081FB1B0008 -:10B8B0004AEF1A00B6143BE08000B2001D060013E8 -:10B8C00002F1EC560400C10000800100C20001003A -:10B8D00000AB9C010D02F1EC5603000000010018C2 -:10B8E000255805C064E06C9681EA1C009818054153 -:10B8F0008CEEFB00CCE0A0276D1896300BE0A02961 -:10B90000BBC092E06C2400EA1C49740C9BE0A027A9 -:10B91000CF1896416CEEFB00C4E0A0275B18943072 -:10B920000BE0A029A9C092E06C2400EA1C4974082D -:10B930009BE0A027BD1894417CE0A018BFEF3B011D -:10B940005C201BC040201BC3C0C498FACCFFC41AA3 -:10B950009B3289190A16AA2049CFD10E982AC830DD -:10B9600009089A0C9B0A9CC72CEF3C015B0A0CEF60 -:10B970006C015BEF3C015B583CC315FACCFFC41A69 -:10B980009B3289190A16AA2049CFD10E983009EEA8 -:10B99000FA00886FDB6F5CC5ACEF3C015B2FFCEFFE -:10B9A0006C015B0E9C2ACC300A300B189830A9B180 -:10B9B0002A2019CFE1910A302CEF6C015CC0F8FA13 -:10B9C000CBFFC41A9A3288170914A92048CFD10E88 -:10B9D000981899089A0C9B0A9CC39CFB1C004A006F -:10B9E0000172001302F1EC560400C2000080010055 -:10B9F000C3000100001427010D02F1EC5603000002 -:10BA0000000100580CC1110E9C2ACC300A300B18D2 -:10BA10009830A9B12A2019CFE1910A300CEF6C01BE -:10BA20005B301CEF6C015CFACAFFC40E9CFE3CFF4D -:10BA300058189E305BB509BD28201BCFD1EF4701B8 -:10BA4000600E9BFE3BFB8C0E9C169E30AAB909BD76 -:10BA500028201ACFD178089D080E9CFE3CFB8CEF65 -:10BA60004C01602F6DD82A800110F08000F3D8EBD4 -:10BA7000CD40F820DD1694149312951097FB160014 -:10BA80005AEF5600480E9A0A9BCD3CE06C12A0EA91 -:10BA90001C0000780C580CC1116E8C089BE0A0278C -:10BAA000198F8C6E8CE0A0024F8F8CEF560046FBF6 -:10BAB0001C0058EF5C0044C438E06C12A4EA1C007F -:10BAC00000FE3CFEB4780A50AA781A50BA782A5080 -:10BAD000CAFACCFFB41A9B3289190A16AA2049CF98 -:10BAE000D10A9CC54D6E8BE0A026F48F8C6E8CE045 -:10BAF000A0022A8F8C301B0A9CE0A028C3C11358D7 -:10BB000036C0710092F0001302F1EC560400C3003D -:10BB100000800100C400010000000F010D02F1ECE3 -:10BB200056030000000100306CEF5C0046EF5C0043 -:10BB300044C1885846C161308CEF5C0046EF5C0020 -:10BB400044C1085836C071307CEF5C0046EF5C00A1 -:10BB500044C0885846C061309CEF5C0046EF5C00F2 -:10BB600044419C8FCC6EDC069BE0A026C58FDC6E2A -:10BB7000DCCE5D8FDC41BCE0A03A0CE0681EB8EA88 -:10BB800018EB85E069B851EA193FAEE0A03979E0D9 -:10BB9000A028408FEC6EEC301BEA1B41C8E0A028C7 -:10BBA00083C043FC1C41C88FEC415CEF4C0040302B -:10BBB0000CEF1B0046580BC031EF4C00408FFC418E -:10BBC0007CEF4C0050FB1C00622B47AE0C2F3DE37A -:10BBD000CF80F8D401E0A07763E04C0BB95F2CD89C -:10BBE00002D7038001B374EBCD40C01896169C14A5 -:10BBF00097EF1B0048583BC151301BE0A02854C0B0 -:10BC0000936E4C0C0C8F4C6E4CCC9D8F4CE3CF80C4 -:10BC1000C06E5C0C0C8F5C6E5CCC1D8F5CE3CF80C7 -:10BC2000C0EF1B0048584B0038EF001302F1EC56F0 -:10BC30000400C40000800100C5000100006AB701D3 -:10BC40000D02F1EC56030000000100C131301BE091 -:10BC5000A0283CC0936E6C0C0C8F6C6E6CCB1D8F4F -:10BC60006CE3CF80C06E7C0C0C8F7C6E7CCA9D8F89 -:10BC70007CE3CF80C00000EBCD40F81896169514F9 -:10BC8000976E0C0C0C8F0C6E0CC9BD8F0C0A9CE0CF -:10BC9000A03992BFDB30183009E0A039ABC4D3E043 -:10BCA0006412A4EA140000E8FC0104585CC392E0AA -:10BCB0006312A0EA130000660B580BC321584CC155 -:10BCC000A16E3B180B8F3B6E3CC7BD8F3C0E9A0A92 -:10BCD0009BE8FC0104C9BF6E3C0C0C8F3C6E3CC75A -:10BCE0000D8F3C0E9A0A9B0C9CC91FC58C301C877B -:10BCF0000CC1082BA78E8C584CC070E8FC00FC0CC3 -:10BD00000CE94C00FCC068E8FC01000C0CE94C019B -:10BD100000E8FC01040C0CE94C0104E3CF80F86E50 -:10BD20003C0C0C8F3C6E3CC4CD8F3C0E9A0A9B0C95 -:10BD30009CC6DFE3CF80F8EF1C0046203CC04020CB -:10BD40001CC090C0F86E1C0C0C8F1C0078560013A1 -:10BD500002F1EC560400C50000800100C60001009D -:10BD600000FF7C010D02F1EC560300000001006EA3 -:10BD70001CC39D8F1CC0E86E2C0C0C8F2C6E2CC32A -:10BD80002D8F2CC0786E1C0C0C8F1C6E1CC2BD8FAE -:10BD90001CE06412A4EA140000E8FC0104585CC032 -:10BDA00042580CC020C19CC0CC300CE06B12A0EA01 -:10BDB0001B0000970CE3CF80F8D703800138A4E084 -:10BDC0006C12A4EA1C0000300BF94B00FCF94B018B -:10BDD00000F94B01045EFDE06C12A4EA1C0000F8BF -:10BDE000FB00FC781A160A991AF8FB01002F8C78D0 -:10BDF0000A160A990A5EFDD43118933002300530D4 -:10BE000004FB1C0032203CC040201CC370C6A8416B -:10BE10001CE0A038E314961697E068999AEA1899FE -:10BE200099E0699999EA193FB9E0A0384E3008FCC9 -:10BE300019400CE0A03734E0A027101895300B060D -:10BE40009CE0A02761C4E3069CE0A038C7149016CC -:10BE500091E06ACCCDEA1ACCCCE06BCCCCEA1B3FAB -:10BE6000FC0C980E99E0A0383000980299E0A000F0 -:10BE70003217001302F1EC560400C60000800100E6 -:10BE8000C70001000040C7010D02F1EC560300009D -:10BE9000000100382CE0A026F31894C358411CE0A0 -:10BEA000A038AE14961697E068999AEA189999E026 -:10BEB000699999EA193FC9E0A038193008FC19407E -:10BEC0000CE0A036FFE0A026DB1895300B069CE0C6 -:10BED000A0272CC193069CE0A0389214901691E004 -:10BEE0006ACCCDEA1ACCCCE06BCCCCEA1B3FEC0C94 -:10BEF000980E99E0A037FB00980299E0A037F7E090 -:10BF0000A026BE1894411C300BE0A074E5C19040FF -:10BF1000B7300B0E9CE0A074DFC1300E9CE0A0385F -:10BF20006F3008FC19404EE0A037E11498169930A4 -:10BF30000AFC1B3FF0E0A03817E0A026A1189204ED -:10BF40009CE0A0385D14921693413CE0A038581450 -:10BF50009616970A9C089BE0A02504E0A03850E0C4 -:10BF600068147BEA1847AEE0697AE1EA193F74E0A9 -:10BF7000A037BD0C980E99E0A037B904980699E057 -:10BF8000A037B5E0A0267CD832D7038001352C80BD -:10BF900001159400C01C001302F1EC560400C70008 -:10BFA00000800100C800010000D72C010D02F1EC57 -:10BFB000560300000001008001B140800137D080AD -:10BFC00001386880013756800114E8EBCD408018B5 -:10BFD00097E06B2401EA1B4974E0A026ADC093E012 -:10BFE0006C2400EA1CC9740E9BE0A024CD18970EA7 -:10BFF0009CE3CD80800000EBCD40801897E06B245F -:10C0000001EA1B4974E0A02697C093E06C2400EA83 -:10C010001CC9740E9BE0A024B718970E9CE3CD803A -:10C0200080D7038001157C800111CCE06B9681EAFA -:10C030001B0098163C5E3CE06B6980EA1BFF6716AC -:10C040000C5EFC3FFB5C5C201CC083203CC053E0CA -:10C0500088000520FCC022301B169C5C6C5EFC3006 -:10C060000B201C5C5C58DCF9BC02011E0C19EC189E -:10C070000F101210121212121210101210100030A3 -:10C080001B169C5C6C5EFC3FFB593CF9BC02131E0A -:10C090000C19EC180F16161A16161A16161A1A1A62 -:10C0A000161E1A222216221A24302BC068301BC0FA -:10C0B00048304BC028303B000734001302F1EC56E7 -:10C0C0000400C80000800100C9000100009797012A -:10C0D0000D02F1EC56030000000100169C5C6C5E42 -:10C0E000FC0000EBCD40C0E067289CEA170000E0B0 -:10C0F000A075708F0CE0A0549BE0A075658F1C307C -:10C1000006C0D85926C071E06A979CEA1A8001F7E8 -:10C110004A025C787C5D1C2FF65C665936E0840030 -:10C12000C86E1BEC0C1505160C300AB88AB89A3F7D -:10C13000F9B8A9B8BAB83AB8CA5836C081E06AB3F3 -:10C14000E4EA1A8000F74A007CCE5B5816C071E022 -:10C150006AAC70EA1A800197FACDDB5826C081E0FC -:10C160006AA81CEA1A8001F74A005CCD4B5806C247 -:10C1700001E06AB400EA1A8001972AE06AB420EA72 -:10C180001A8001973AE06AB410EA1A8001974AE0EF -:10C190006AB40CEA1A8001975AE06AB41CEA1A8061 -:10C1A00001976AE06AB420EA1A8001977ACB3B587B -:10C1B00046C081E06AAA88EA1A8001F74A009CCA50 -:10C1C000AB5856C081E06A5668EA1A8001F74A0007 -:10C1D000BCCA1B5866C081E06AA93800BC52001373 -:10C1E00002F1EC560400C90000800100CA00010001 -:10C1F00000025C010D02F1EC56030000000100EAB0 -:10C200001A8001F74A00DCC98B5876C081E06A8C3D -:10C2100060EA1A8001F74A00FCC8FB5886C081E03A -:10C220006A70DCEA1A8001F74A011CC86B5896C094 -:10C2300081E06A3E7CEA1A8001F74A013CC7DB587C -:10C24000A6C081E06AAADCEA1A8001F74A015CC74D -:10C250004B58B6C081E06AA98CEA1A8001F74A01FE -:10C260007CC6BB58C6C081E06AA7B8EA1A8001F74D -:10C270004A019CC62B58D6C081E06A89D4EA1A804C -:10C2800001F74A01BCC59B58E6C081E06A5B38EA09 -:10C290001A8001F74A01DCC50B58F6C081E06A86B6 -:10C2A000F8EA1A8001F74A01FCC47B5906C081E014 -:10C2B0006A8B2CEA1A8001F74A021CC3EB5916FE5E -:10C2C00091FF34E06A64C0EA1A8001F74A023CC375 -:10C2D0004BE3CF90C0D7038001B3F480017250804C -:10C2E00001B3E8EBCD40FC209D189716943016EE74 -:10C2F000051505E063289CEA13000058B4C1F1005D -:10C300005137001302F1EC560400CA00008001000E -:10C31000CB00010000BDE7010D02F1EC5603000067 -:10C3200000010066120A02059C581CC1A5F9D7B08D -:10C3300008CBFE581CC1550592F9D7B008CB9EF822 -:10C34000021900C0E50E9CC0AD1896300C661B0AA1 -:10C350000BB69CE06CBF90EA1C8001FEB0D2586620 -:10C360001C0A0C198B581BC184199B581BC15430D3 -:10C370000BB88BB89BFACCFFC01A9B3249190A162E -:10C38000AA2049CFD10E9CC3CC582CC031302CC32D -:10C3900038583CC021303658A4C071661C0A0C19AC -:10C3A0008B2FFBB88BC12858B4C1015837C08166A8 -:10C3B0001C29FC198C580CC031FEB0F4EB661C0A29 -:10C3C0000C2FFC198B2FFBB88B661C1805660C799B -:10C3D0008A2A4C988BFAEB000C0B9A0B8BFAEB0029 -:10C3E000045007E06CBF90EA1C80012F8CFEB0D295 -:10C3F0000F0C9C5C6C2F7DE3CD80FC8000B56CD471 -:10C4000021209D18973016E065289CEA1500006AE7 -:10C410001CEE0415051804F9D7C008C6CEA8AC3028 -:10C420000CA8BC00E0C3001302F1EC560400CB00E2 -:10C4300000800100CC00010000A9CF010D02F1EC49 -:10C4400056030000000100A83CFACCFFC81A9B323A -:10C4500049190A16AA2049CFD1682C5D1C582CC056 -:10C4600031302CC0F8583CC0313036C0986A0B7758 -:10C470008A301CF807094C184AF74A00600C9C5C8B -:10C480006C2F7DD8220000EBCD40FE205D18971662 -:10C49000943016EE051505E063289CEA130000664B -:10C4A000120A02059C582CC185F9D7B008C13E5824 -:10C4B0001CC1350591F9D7B008C0DEF8011900C0DC -:10C4C000C5F9D7B008FEB0FE07A49CE06CBF74EAC3 -:10C4D0001C8001FEB0D1AE661BF605000C198A580F -:10C4E0001AC044199A581AC30558A4C0C1198B58C8 -:10C4F0001BC065198BFE3BFF01B88BC198300BB890 -:10C500008BC16858B4C141199A581AC0752FFC19CB -:10C510008AFE3AFF01B88AC038300AB89A5837C044 -:10C520007129FB178C580CC031FEB0F457661C0AF9 -:10C530000C198B580BC091199C580CC0610E9CC2F1 -:10C540000C583CC0213036008D16001302F1EC5619 -:10C550000400CC0000800100CD00010000C3770181 -:10C560000D02F1EC56030000000100661C18056680 -:10C570000C798A2A4C988BFAEB000C0B9A0B8BFAED -:10C58000EB00045007E06CBF74EA1C80012F8CFEA6 -:10C59000B0D1620C9C5C6C2FBDE3CD80FED70380D4 -:10C5A00000B590D42118973016EE051505E06428E3 -:10C5B0009CEA140000681C0A0C783C5D1C583CC0C6 -:10C5C000213036F9D7B008C8AD583CC021303668A4 -:10C5D0001C18053FFCAAAC300CAABCAA3C680C791C -:10C5E0008B301AF407094A148BF94B00600C9C5CE1 -:10C5F0006CD822EBCD40C0202D1897E066289CEA2D -:10C600001600006C1BEE0C1505160C300BB88BB821 -:10C610009BF9D7B010CC7F6C0C7986BB17E06CC14E -:10C62000A4EA1C8001FEB0D1172FEDE3CF90C0EB40 -:10C63000CD40F822FD18961697301CFB6C005DE08B -:10C6400065289CEA150000FACCFFA06A0B35C917D3 -:10C650000A18AA2049CFD1FACCFFA01A9B35C919D4 -:10C660000A16AA2049CFD10A9C2F8C00F427001368 -:10C6700002F1EC560400CD0000800100CE00010064 -:10C680000056BC010D02F1EC56030000000100E071 -:10C69000A002563004C0E8583CC061FB64005C3026 -:10C6A0003CFB6C005D300C6A1B1603A6BC2FF45CCF -:10C6B000645934C2F4301CF804094B6A0C798C18A4 -:10C6C0006BCF60E80315056A1B060BF72C000258B8 -:10C6D0000CCEE52FEBF72C0000E0A04C3F6A1B06C8 -:10C6E0000B17BA2FFAB6BA17BAAF3A183ACE057680 -:10C6F0004C5D1C582CCD11FB64005C302CFB6C0095 -:10C700005DFACCFFA4198BAC8B199BAC9B0C9CC025 -:10C7100088FACCFFA4198BAC8B199BAC9B0C9C2D7D -:10C720001DE3CD80F8D703800166C8300B586CC07C -:10C7300022301B169C5C6C5EFC0000EBCD40FC20A4 -:10C740004DFB3600305C66FB23002DE6071505E047 -:10C7500065289CEA1500006A140E04E92C00020CFE -:10C760003CC0915003E06CBC60EA1C8001FEB0D07C -:10C7700085C618F9D6B008CDAFC0F12FE4E927007F -:10C7800000FAE700045003E06CBC60EA1C80010082 -:10C790004F6D001302F1EC560400CE000080010042 -:10C7A000CF00010000E907010D02F1EC5603000083 -:10C7B0000001002F4CFEB0D073C4F83004C2286AC8 -:10C7C0001C0E0C98BCF8040A4CA19CC1A2301AF7AC -:10C7D000D6B008F9D4B008E0A04B08C1216A1C0EFD -:10C7E0000C2FECF92B00000C9AFAEB00080892BB16 -:10C7F00013E06CBC60EA1C80012E0CFEB0D0502F00 -:10C80000F45C6458A4CDD53004C21898BBF6040A71 -:10C810004BA19BC1B2301A2FECF92B0000F9D4B018 -:10C8200008E0A04B35C1216A1C0E0C2FECF92B003F -:10C83000000C9AFAEB00080892BB13E06CBC60EAAB -:10C840001C80012C8CFEB0D02B2FF46A1C0E0C5CCB -:10C850006458A4CDC5B8A62FCDE3CF80FCD7038004 -:10C86000016534EBCD40803007E06C289CEA1C0069 -:10C8700000780C798CEDBC000CC072E06C00C8E054 -:10C88000A06AB4C02030170E9C5C6CE3CD80808021 -:10C8900001A534EBCD40F8189730063005C1E8EA21 -:10C8A000041505E063289CEA130000661B080B30A2 -:10C8B0000CB6CC00D945001302F1EC560400CF00B1 -:10C8C00000800100D000010000F96F010D02F1ECC1 -:10C8D00056030000000100301CF805094A660C7977 -:10C8E0008C186AC0B0F9D7B008765B5D1BC06030A9 -:10C8F0001C661B1604A8CC30162FF55C655935CE86 -:10C90000250C9C5C6CE3CD80F80000300BC0C83077 -:10C910000AE06C289CEA1C00007819F60C15051832 -:10C9200009B2CA2FFB5C6B593BCF355EFD0000306E -:10C930001BF60C094BE06C289CEA1C0000780C7973 -:10C940008C186B5F1C5EFCEBCD40FC202D189330E7 -:10C9500015E6071505E066289CEA1600006C1C0E1B -:10C960000C98BC581CC2653004C04830352FF45CAC -:10C970006458A4C1F46C190E0992BB301CF8040968 -:10C980004C186BF604084C5C6C581CCF11301A2FF5 -:10C99000E9F32B0000F9D4B008E0A04A8BCE700870 -:10C9A00092BB13E06CC1BCEA1C8001FEB0CF8ACD03 -:10C9B000FB0A9C5C6C2FEDE3CD80FC800165D88088 -:10C9C000006FE8EBCD4080216D1897300CFB5C00C8 -:10C9D00054FB6C002D30AB00C9BE001302F1EC56C5 -:10C9E0000400D00000800100D100010000EDD20160 -:10C9F0000D02F1EC56030000000100FB6B002EFB62 -:10CA00006C0030FB6C0031EDB70002C272305CCAC2 -:10CA10002FC110304CFB6C002C305CFB6C002DFAED -:10CA2000CCFFD41A9B32C9190A16AA2049CFD1E0EB -:10CA3000A04150302CC8FFC110304CFB6C002C3092 -:10CA40002CFB6C002DFACCFFD41A9B32C9190A16A4 -:10CA5000AA2049CFD1E0A0413DEDB70004C142304A -:10CA60008CC79FC110303CFB6C002C308CFB6C00E1 -:10CA70002DFACCFFD41A9B32C9190A16AA2049CF25 -:10CA8000D1E0A041272EADE3CF8080800153D4D4E4 -:10CA900021E02D03AC18971696300CFB6C00683023 -:10CAA00005C1C8E06B289CEA1B0000301CF8050992 -:10CAB0004A760C798C186AC0F0761CEA0A150518BB -:10CAC0000AF52C0004581CC071FACBFF98FACCFF71 -:10CAD00094746A5D1A2FF55C655935CE450D8BFB54 -:10CAE0003C0068180B58BBC2450D8CFB350068181C -:10CAF0000520A55C65E9D5B008C15800914900132F -:10CB000002F1EC560400D10000800100D2000100C7 -:10CB1000007819010D02F1EC56030000000100E855 -:10CB20000C10680E0C189B1A9A3688170914A92045 -:10CB300048CFD1E805010BF60B10680E0B19AC5C61 -:10CB40006CC65C2FF45C640D8C1834CEA50D8C186B -:10CB500025AC853005C198FACBFF94EA0C10681615 -:10CB60000C189B1A9A3688170914A92048CFD10DA2 -:10CB70008BF60B10680E0B19AC5C6CC48C0D8C2FF3 -:10CB8000FCAC8C2FF55C65FB3C00681835CE55FE7F -:10CB90003DFC54D82A0000D401300A589CC061588A -:10CBA0001BC041E0A03676301A149C5C6CD8028021 -:10CBB000013F70E06B289CEA1B00002F8B32C917E5 -:10CBC0000A18AA2049CFD122CC5EFC400B990B4019 -:10CBD0001B991B402B992B403B993B404B994B4059 -:10CBE0005B995BFB0B004AF95B0018FB0B004CF9EF -:10CBF0005B001AFB0B004EF95B001C40CB998B408D -:10CC0000FB999B410B99AB5EFD0000202C5C5C59AD -:10CC10001CF9BC02021E0C19EC180F7A14A87A0039 -:10CC2000E1F7001302F1EC560400D200008001008D -:10CC3000D300010000C7A2010D02F1EC5603000071 -:10CC40000001007A7A7A5C7A7A8C7A7A7A7A7A7ABD -:10CC5000001B8CB68C1B9CB69C583CC0311BCCB6C0 -:10CC6000CC1BACB6AC1BDCEDBC0007C0B3B6DC2FF4 -:10CC70008BFACCFFF83109192A16BA2029CFD15ED8 -:10CC8000FDE06C0080B6DC2F8BFACCFFF8330AB9DC -:10CC900009B728208ACFD15EFD1B8CB68C1B9CB6B1 -:10CCA0009C1BACB6AC169C2FCCFACAFFFC364815C0 -:10CCB0000918A92048CFD11B8CB68C1B9CB69C1B95 -:10CCC000ACB6AC1BCCB6CC5EFD1B8CB68C1B9CB63C -:10CCD0009C1BACB6AC2FCBFACCFFFC30A9192A16A2 -:10CCE000BA2029CFD15EFDB18CF9DCC001EC1C006B -:10CCF000015EFCD401201CC060201CC070201CC040 -:10CD000080D80AE0A06344D80AE0A0635FD80AE0B4 -:10CD1000A0637AD80AD70380019A4880019A848058 -:10CD2000019AC0D401201CC060201CC070201CC00F -:10CD300080D80AE0A0633AD80AE0A06355D80AE098 -:10CD4000A0637000764E001302F1EC560400D3008D -:10CD500000800100D400010000D38A010D02F1EC33 -:10CD600056030000000100D80AD70380019A6480AE -:10CD7000019AA080019ADC201CC080201CC0C02029 -:10CD80001CC0F0201C5E0F5EFDFE7C1814780CF9B0 -:10CD9000DCC0015EFC486C780CF9DCC0015EFC482C -:10CDA0004C780CF9DCC0015EFCD703FFFF1864FF70 -:10CDB000FF1850EBCD40801897F9D7C008CDDFCFD2 -:10CDC000D0E3CF80800000300B990B5EFD0000782F -:10CDD0000AE01AE0FFF5EB108B990B5EFD0000787E -:10CDE0000AE21AFFFD990A582B5E3D780AA1BA990A -:10CDF0000A780A201BAF7BE61BFFFF144B990B5EE2 -:10CE0000FD0000EBCD40E0189616951497300BCD41 -:10CE1000CF0A9B0C9CCDDF0E9B0C9CCE2F362C8D0D -:10CE20001CE06CB400EA1C04C48D2CE46C00048D7E -:10CE30003C300C8D4CE3CF80E00000FE7C18147871 -:10CE40000CA99CF9DCC0015EFC0000EBCD40801811 -:10CE5000970E9CCF4FCFE0E3CF8080E06C0D30EA9F -:10CE60001C0000F92B00000091C6001302F1EC56E3 -:10CE70000400D40000800100D500010000B9320197 -:10CE80000D02F1EC560300000001005C5BC0602065 -:10CE90002BC070201BC0A05EFDE07CC1385EFCE0B2 -:10CEA0006C5A00EA1C02625EFCE06C0E00EA1C0791 -:10CEB000275EFCD401CE5FA38CD802D401189B302E -:10CEC0002CE0A05469D80A80017E08EBCD40C01840 -:10CED000961697CF0F8F0CFE7C44001836C0413059 -:10CEE000BCCEDFC078FE7C48001836C03130CCCED6 -:10CEF0006F0E9B0C9CE0A02ADBE3CD80C0D70380A3 -:10CF0000012B20EBCD4080E06C0160EA1CAA004BB5 -:10CF10005B970C4B1C780CA1DC4B0B970C300CE096 -:10CF2000A05FF4E0A038A0311CEA1CA500FE6B0055 -:10CF300000971C3007FE6C00009907304CEA1CAAD1 -:10CF4000004A9B970CFE7C14049907308CEA1CAABB -:10CF500000970C4A5C990730CCEA1CAA00970C4A4F -:10CF60003C9907310CEA1CAA00970C4A1C9907E06F -:10CF7000A065B24A1C9907FC1C0FF84A0B970C4A93 -:10CF80001C780C3447EA17AA004A0B0014D6001389 -:10CF900002F1EC560400D50000800100D60001002B -:10CFA000002CF9010D02F1EC56030000000100977E -:10CFB00007A5DC49DB970CFE7C1800E0A00262E0CC -:10CFC000A065B6499C780CE81C0017498B97074967 -:10CFD0006B970C496B9707B3CC494B970C34CCEA51 -:10CFE0001CAA00492B970C492C780CE01CFFF04937 -:10CFF0000B970CE0A065B0E3CF9080FFFF15608039 -:10D0000001957C800146D8FFFF1458FFFF1408FFEC -:10D01000FF140CFFFF14108001A148FFFF2C70FFCC -:10D02000FF2E708001A17CFFFF1844FFFF1818FF3E -:10D03000FF184C8001A1A4D401204D1A9CE06BC0C4 -:10D0400078EA1B8001B709B928B709B9281A9BFEED -:10D050007C4400C4EF5C6C2FCDD802EBCD40C020E7 -:10D060001D1897348CE0A05F99E066C298EA16809C -:10D07000015C57C0E0305CE0A06D4C304CE0A06D2E -:10D08000496C0C500C302B1A9CE0A060BFC0D8310A -:10D090005CE0A06D3F314CE0A06D3C6C1C500C304E -:10D0A0002B1A9CE0A060B2348CE0A05F992FFD00A9 -:10D0B0005D97001302F1EC560400D60000800100D9 -:10D0C000D7000100009342010D02F1EC560300006D -:10D0D000000100E3CF80C0D401206DFACCFFF4E062 -:10D0E0006BC1C8EA1B8001B709B928170818A8C086 -:10D0F0006F503CE06C9DD8EA1C8000500CE06CA4A2 -:10D1000078EA1C8000501CE06C9D6CEA1C8000508A -:10D110002C1A9AFACBFFF4FE7C4C00E0A064125C5F -:10D120006C2FADD802D70380019F6CEBCD408020DF -:10D130002D306CE0A06D00301B306CE0A0665030EC -:10D140009CE0A06CF9301B309CE0A0664930BCE04C -:10D15000A06CF2301B30BCE0A0664230ECE0A06C6A -:10D16000EB301B30ECE0A0663B316CE0A06CE430AF -:10D170001B316CE0A06634325CE0A06CDD301B3209 -:10D180005CE0A0662D329CE0A06CD6301B329CE0A7 -:10D19000A0662632BCE0A06CCF301B32BCE0A0669B -:10D1A0001F32CCE0A06CC8301B32CCE0A066183235 -:10D1B000DCE0A06CC1301B32DCE0A0661132ECE098 -:10D1C000A06CBA301B32ECE0A0660A30DCE0A06C48 -:10D1D000B3300B00578B001302F1EC560400D7005C -:10D1E00000800100D80001000004A9010D02F1EC4B -:10D1F0005603000000010030DCE0A06603300CE0C4 -:10D20000A06CAC301B300CE0A065FC301CE0A06CC6 -:10D21000A5301B301CE0A065F5302CE0A06C9E30E2 -:10D220001B302CE0A065EE303CE0A06C97301B304A -:10D230003CE0A065E7307CE0A06C90301B307CE0E7 -:10D24000A065E0308CE0A06C89301B308CE0A065DC -:10D25000D9320CE0A06C82301B320CE0A065D232D7 -:10D260001CE0A06C7B301B321CE0A065CB324CE094 -:10D27000A06C74300B324CE0A065C4311CE0A06C93 -:10D280006D300B311CE0A065BD314CE0A06C663008 -:10D290000B314CE0A065B6315CE0A06C5F300B3127 -:10D2A0005CE0A065AF304CE0A06C58300B304CE037 -:10D2B000A065A8305CE0A06C51300B305CE0A0654C -:10D2C000A1322CE0A06C4A301B322CE0A0659A31D0 -:10D2D0000CE0A06C43301B310CE0A06593326CE095 -:10D2E000A06C3C300B326CE0A0658C323CE0A06C52 -:10D2F00035303B323CE0A000D951001302F1EC562E -:10D300000400D80000800100D9000100004412018F -:10D310000D02F1EC56030000000100658530FCE0D1 -:10D32000A06C2E300B30FCE0A0657E312CE0A06CB0 -:10D3300027300B312CE0A06577313CE0A06C203029 -:10D340000B313CE0A06570327CE0A06C19300B32F0 -:10D350007CE0A0656932ACE0A06C12300B32ACE02E -:10D36000A06562328CE0A06C0B300B328CE0A065C3 -:10D370005BE067C290EA1780016E0C501C302BFAFC -:10D38000CCFFFCE0A05F786E1C500C302B1A9CE0A8 -:10D39000A05F722FEDE3CF8080D7038001B1608062 -:10D3A00001A40880019858EBCD40C03016FE771CD0 -:10D3B000003009300A301BFE7C1C00E0A06472C003 -:10D3C000C13009300A300BFE7C1C00E0A0646AC04A -:10D3D00031E3CF80C03026CA4DCB5DC90D301AE095 -:10D3E0006B0120E06C4320EA1C8000E0A066184836 -:10D3F000BC780CEDBC0018CFC36E0CA9AC8F0C48E8 -:10D400007C780CEDBC0018CFC3E0A001E70C9C5C5D -:10D410006CE3CD80C0D7038001A2840046CD001309 -:10D4200002F1EC560400D90000800100DA0001008E -:10D4300000D1D9010D02F1EC56030000000100FFFC -:10D44000FF1C08300BC0B8FE6A0400F40B002A74FD -:10D4500009E019FFF8A1A995092FFB584BCF5330CC -:10D460000BC0F8FE6A0440F40B002A7409E419FFAB -:10D47000FCE2780000F1EC0108104995092FFB58F7 -:10D480004BCF135EFD0000D401300CCDCF340CE047 -:10D49000A05DEE345CE0A05DEB347CE0A05DE834A0 -:10D4A0009CE0A05DE534ACE0A05DE234CCE0A05DA2 -:10D4B000DF34ECE0A05DDC357CE0A05DD9359CE09C -:10D4C000A05DD6360CE0A05DD3361CE0A05DD03266 -:10D4D0000CE0A05DCD322CE0A05DCA324CE0A05D36 -:10D4E000C7340CEA1CAA00489B970C300C487B9769 -:10D4F0000C310CEA1CAA00485B970CE06C0081FE22 -:10D500007B1410970CD80AFFFF1440FFFF145879C2 -:10D510001B344AEA1AAA00996AA5DBF94B00445E5B -:10D52000FD0000D401E1BC0000FEB0FC5DD303E0CF -:10D530006B0160EA1BAA00FE7A1458950BE06B00A1 -:10D540008F69001302F1EC560400DA00008001003C -:10D55000DB000100006E62010D02F1EC56030000D9 -:10D5600000010000C0484A950B5C5CC020D503D880 -:10D570000AD703FFFF1560EBCD4080301CE0674900 -:10D5800044EA170000AE9C300BAEFBEF6B000DEFD2 -:10D590006B0013EF6B0019AEABEF6B0008EF6B0085 -:10D5A0000EEF6B0014EF6B001AAECBEF6B000AEFBF -:10D5B0006B0010EF6B0016EF6B001CAEDCEF6C0025 -:10D5C0000BEF6C0011EF6C0017EF6C001DAE8C3090 -:10D5D0002CAEEC303CEF6C000C304CEF6C00123099 -:10D5E0005CEF6C0018306B327CE0A05E79306B32FF -:10D5F0008CE0A05E75306B30FCE0A05E71306B3269 -:10D60000ACE0A05E6D306B312CE0A05E69305A0E4C -:10D610009BFE7C2400E0A05995E3CF8080D7038057 -:10D6200001987880018EDCD4211895169714960AFB -:10D63000942FF45C64346CE0A05D0AEA0C1518C207 -:10D6400061EC0C1518C081300CE06B4944EA1B00FA -:10D6500000B6BCC0985816C071301CE06B4944EA53 -:10D660001B00000024E1001302F1EC560400DB0073 -:10D6700000800100DC000100007A4A010D02F1EC9B -:10D6800056030000000100B6BCE06C4944EA1C00EF -:10D6900000301B198AF60A094B19BC581C4ADC7861 -:10D6A0000CC031184BC038168C189B4A9C990B5CE7 -:10D6B00057C3A0089BFE7C2400E0A059B75815C1B1 -:10D6C00001301AE06B0161E06C42FCEA1C8000E072 -:10D6D000A064DC089BFE7C2400E0A059B3C358EA98 -:10D6E0000C1518C101301AE06B0160E06C4314EABC -:10D6F0001C8000E0A064CA089BFE7C2400E0A059C6 -:10D70000A1C2385845C211301AE06B0180E06C4369 -:10D7100008EA1C8000E0A064B9089BFE7C2400E0BD -:10D72000A05990C1285815C060EA0C1518C030588F -:10D7300045C061089BFE7C2400E0A05989089BFE3F -:10D740007C2400E0A05978346CE0A05CB5D82AFFB6 -:10D75000FF241C80018FA08001A60080018FB8806B -:10D76000018FC480018FACFE7C1C08780BEDBB00E0 -:10D7700018CFB3485B760BA9AB484A950B780BEDF5 -:10D78000BB0018CFD35EFD00FC55001302F1EC5630 -:10D790000400DC0000800100DD0001000010F20147 -:10D7A0000D02F1EC56030000000100FFFF1C10FE0B -:10D7B0007C1C08780BEDBB0018CFB3485B760BA937 -:10D7C000AB484A950B780BEDBB0018CFD35EFDFF3D -:10D7D000FF1C1CFE7C1C08780BEDBB0018CFB34867 -:10D7E0005B760BA9AB484A950B780BEDBB0018CFC5 -:10D7F000D35EFDFFFF1C0CEBCD4080581BC0D1E079 -:10D80000A01C5CE06B126FEA1B4183E0A01A8CE065 -:10D81000A01C2E189BC0A8E0A01C50FC1B4266E078 -:10D82000A01A82E0A01C24189B4A0C780CEDBC00C6 -:10D8300018CFC3FE7C1C00E0A062B649BC780CED9A -:10D84000BC0018CFC3300BFE7C1C00E0A0629EE33E -:10D85000CF80808001160C80011278800115C08075 -:10D8600001A2F88001A2DC490C780CEDBC0018CFB5 -:10D87000C3FE7C1C00780BA1CB990B48BC780CED47 -:10D88000BC0018CFC35EFD488C780CEDBC0018CFEF -:10D89000C3FE7C1C00780BA1AB990B483C780CEDC7 -:10D8A000BC0018CFC35EFDFFFF1C08004F0900132A -:10D8B00002F1EC560400DD0000800100DE000100F2 -:10D8C000008539010D02F1EC560300000001003023 -:10D8D0000CFE7B1C00760BEDBB0000C022301C5CF4 -:10D8E0005C5EFCD401340CFE6B0000970CE0A05091 -:10D8F00055DA0A80017EC8D401205D343CE0A05B8B -:10D90000DD301CFEB0FABEE06904C4301A301B1AC8 -:10D910009CFEB0FB2D301CFEB0FB02300B1A9CE0CD -:10D92000A04590302A302B302CE0A04FF1300CFE77 -:10D93000B0FB42302CE0A0501B303CFEB0FABA34B1 -:10D940003CE0A05BDD2FBDDA0AD703800195E880BB -:10D9500001697080017E3C80017E9C8001962CD400 -:10D9600021201D189616973005E0A06AAD1894E99D -:10D970001B0066301CF806094C184BE95B0066E991 -:10D980001C0066500CE06CC198EA1C8001FEB0C817 -:10D99000955876C071E06C3EA8EA1C000028BCB81F -:10D9A0008729A4888C581CC02530150A9C5C5C2FE4 -:10D9B000FDD822D42118943006FEB0C7631895E034 -:10D9C0006CC2B0EA1C8001FEB0C8783007C02800E5 -:10D9D0009D76001302F1EC560400DE000080010089 -:10D9E000DF000100003A82010D02F1EC5603000055 -:10D9F0000001002FF75C6758A7E0840102E91C00D2 -:10DA000066F8070A4CA19CCF620E9C5C5C58ACF98E -:10DA1000BC020A2FECFE0C001FC0B8C1D8C368C4FA -:10DA2000D8C618C738C878C9C8CB78CCD8CDE8E0F4 -:10DA30006C3F20EA1C00007809E06C3EA8EA1C005C -:10DA400000189B2F6B300AB68A2F6C72BB767B5DF9 -:10DA50001B1896CCB8E06C3F20EA1C00007819E057 -:10DA60006C3EA8EA1C0000300BF96B000B189B2FD2 -:10DA70005B3008169E322A1CC8201ACFE12F5C7238 -:10DA8000BB767B5D1B1896CB18E06C3F20EA1C0030 -:10DA9000007829E06C3EA8EA1C0000189B2D3B3062 -:10DAA0000AB68AB69AB6AAB6BAB6CAB6DA2D3C7221 -:10DAB000BB767B5D1B1896C998E06C3F20EA1C0082 -:10DAC000007829E06C3EA8EA1C0000189B2CDB3093 -:10DAD0000AB68A2D3C189B304C72B972895D1918B0 -:10DAE00096C848E06C3F20EA1C00007839E06C3EA4 -:10DAF000A8EA1C005D79001302F1EC560400DF0077 -:10DB000000800100E000010000A5E9010D02F1EC38 -:10DB1000560300000001000000189B2CCB300AB611 -:10DB20008A2CCC72BB767B5D1B1896C718E06C3EC6 -:10DB3000A8EA1C00006A0BF96B00356A3BF96B0020 -:10DB4000366A5BF96B00376A6BF96B0038301B2C57 -:10DB50007CB88B3016C5C8E06C3F20EA1C0000780A -:10DB600019E06C3EA8EA1C0000189B2C6B300AB62A -:10DB70008A301BF96B003A2C6C72BB767B5D1B18EC -:10DB800096C468E06C3F20EA1C00007819E06C3E07 -:10DB9000A8EA1C0000189B2C5B300AB68A301BF9DF -:10DBA0003A00752FCAF60A094BA1BBF96B003B2C52 -:10DBB0005C72BB767B5D1B1896C2A8E06C3EA8EA3F -:10DBC0001C00002C4C300A300BB91BF8EB0008F895 -:10DBD000EB0010F8EB0018F8EB0020F8EB0028F849 -:10DBE000EB0030C22C1896C138E06C3F20EA1C00D4 -:10DBF000007869E06C3EA8EA1C0000189B28CB3036 -:10DC00000AB68A28CC72BB767B5D1B1896F5D6C007 -:10DC100008F7D7B008E06C007DB6001302F1EC56AF -:10DC20000400E00000800100E1000100001958013B -:10DC30000D02F1EC560300000001003EA8EA1C00B2 -:10DC400000E0A0030D0C9C5C5CD822D431208D3008 -:10DC50000CBACCE060C02CEA108001A10AFAEB00FB -:10DC6000083007FEB0C64418963005C2C8169AA1FF -:10DC70007AFAC9FFF814091388A96813991009FAE8 -:10DC8000C8FFF0F00A0A095C89F20A14082C4CB8A3 -:10DC90008A2FF75C67E807000C2C4CB8892FF72F08 -:10DCA000FB5C6B089C5C670E0C582BCE15300B2C64 -:10DCB0004CB88B2FF766BC782C5D1CE081019D2F42 -:10DCC000F55C655885E084023CE0643EA8EA1400F7 -:10DCD000005C67E807000C2C4CB8852FF7E0613F2B -:10DCE00020EA110000E20503230A9C588CF9BC02CB -:10DCF00008FE0C001C984C180F001400AC013801F1 -:10DD0000C402B203040410039AFFC866BC781C5D09 -:10DD10001CCD70E06B02BC0C9CFEB0C8D1306BFA1D -:10DD2000CCFFF866BA745A5D1ACCB0300BC178F6E5 -:10DD30000A1501FACCFFF8140C1999009DAB0013D9 -:10DD400002F1EC560400E10000800100E200010055 -:10DD5000008C93010D02F1EC56030000000100A9B4 -:10DD600069198C1809E06C0E80EA1C0000140C98EC -:10DD70000C1809FACCFFF0F80A0A092FFB5C6B5863 -:10DD80003BCE95FACBFFF0300CCF3D300BC158FAAB -:10DD9000CCFFF0F80B041CF80A14085C67E80700D5 -:10DDA000092C49B28A2FF75C67E807000A2C4AB4AD -:10DDB0008C2FF72FFB5C6B583BCEB566BC782C5D87 -:10DDC0001CC911300CCCF966BC781C5D1CC8B0E0D5 -:10DDD0006B03200C9CFEB0C885306BFACCFFF86654 -:10DDE000BA745A5D1AFE90FF7F300BC108F60A150F -:10DDF00001FACCFFF8140C1999A969198C1809FAC1 -:10DE0000CCFFF0F80A0A092FFB5C6B583BCF05FAF0 -:10DE1000CBFFF0301CCADD300BC158FACCFFF0F854 -:10DE20000B041CF80A14085C67E80700092C49B2C7 -:10DE30008A2FF75C67E807000A2C4AB48C2FF72F6B -:10DE4000FB5C6B583BCEB566BC782C5D1CFE91FF2D -:10DE50004BCB9B66BC781C5D1CFE90FF45332B00B2 -:10DE600087C3001302F1EC560400E20000800100B9 -:10DE7000E3000100003328010D02F1EC560300001D -:10DE80000001000C9CFEB0C83F306BFACCFFF86676 -:10DE9000BA745A5D1AFE90FF39300BC108F60A15A4 -:10DEA00001FACCFFF8140C1999A969198C1809FA10 -:10DEB000CCFFF0F80A0A092FFB5C6B583BCF05FA40 -:10DEC000CBFFF0302CC67D300BC158FACCFFF0F8F8 -:10DED0000B041CF80A14085C67E80700092C49B217 -:10DEE0008A2FF75C67E807000A2C4AB48C2FF72FBB -:10DEF000FB5C6B583BCEB566BC782C5D1CFE91FF7D -:10DF000005C73B66BC781C5D1CFE90FEFF33CB0C46 -:10DF10009CFEB0C7F93002C188300C66BB764B5D01 -:10DF20001B314B0C9CFEB0C7EF301C66BB764B5DC3 -:10DF30001B314B0C9CFEB0C7E7306BFACCFFF86688 -:10DF4000BA745A5D1A2FF25832CE85300BC0D858A9 -:10DF50002BC091FB3A000BA96AFB3C000C180AFB92 -:10DF60005A00142FFB5C6B583BC134580BC0A1FB0B -:10DF70003A0008A96AFB3C0009180AFB5A0010CFB6 -:10DF80002B581B004BE7001302F1EC560400E30092 -:10DF900000800100E4000100002700010D02F1EC07 -:10DFA00056030000000100CE61FB3C000AFB5C0050 -:10DFB00012CEBBFB0B0010A96BFB0C0012160CF869 -:10DFC0000B14105C67E807000A2C4AB48B2FF7F893 -:10DFD0000B14085C67E807000A2C4AB48B2FF75C27 -:10DFE00067E807000B2C4BB68C2FF7FB0C0014F8DE -:10DFF0000B14085C67E807000A2C4AB48B2FF75C07 -:10E00000670E042C44A88C2FF766BC782C5D1CFE90 -:10E0100091FE8ECFCA66BC781C5D1CFE90FE8833D4 -:10E02000CB0C9CFEB0C782306BFACCFFF866BA749A -:10E030005A5D1AFE90FE7C300BC0D8FACCFFF81661 -:10E040000C198C5C67E807000A2C4AB48C2FF72F58 -:10E05000FB5C6B584BCF3566BC782C5D1CFE90FE8C -:10E0600067301CBACCC63A300CBADC300266BC78D9 -:10E070001C5D1CFE90FE5C301BFACCFFFB625A74E8 -:10E08000BA746A5D1AE06B00960C9CFEB0C74E3005 -:10E0900001C0282FF158A1C164306BFACCFFF8669B -:10E0A000BA745A5D1A314B0006AB001302F1EC56FC -:10E0B0000400E40000800100E5000100004DB8010B -:10E0C0000D02F1EC560300000001000C9CFEB0C7ED -:10E0D0003FFB3C0008500C009C2F8CFEB0C56CFB35 -:10E0E0003200085862CE94E0A0676C5C67E80700D5 -:10E0F0000BF93C0082043CC064301C2C4BB68C2FC6 -:10E10000F7C058300C2C4BB68C2FF75C670E042CE4 -:10E1100044A8822FF766BC782C5D1CFE91FE1AC8BD -:10E120008A66BC781C5D1CFE90FE14E06B02580CE5 -:10E130009CFEB0C70D306BFACCFFF866BA745A5D1E -:10E140001AFE90FE07300BC1F8F60C1501FACAFF53 -:10E15000F8180A1589A969159A120AFAC9FFF0F286 -:10E160000C0A0A5C8AF40C14085C67E80700092CA6 -:10E1700049B28C2FF75C67E807000C2C4CB88A2F4B -:10E18000F72FFB5C6B584BCE1566BC782C5D1CFEE4 -:10E1900091FF7BFE9FFDDE66BC781C5D1CFE90FD42 -:10E1A000D9300C66BB764B5D1B301CE76C000F331F -:10E1B000CB0C9CFEB0C6CC306BFACCFFF866BA74C0 -:10E1C0005A5D1AFE90FDC6300BFE9F00D8830013E7 -:10E1D00002F1EC560400E50000800100E6000100B9 -:10E1E00000D873010D02F1EC56030000000100FDA0 -:10E1F000B51BCC2F8DD83280006DB080007380EBC2 -:10E20000CD40C0202D18961697E0A066EDE06BC2B9 -:10E21000C0EA1B8001B70ABB1B300B5806C031E0B7 -:10E220006BFFFF180628260D8C588CF9BC02001EC7 -:10E230000C19EC180F0A18283A4A5C6C7E8E0CBA3E -:10E240000C8E1CBA1C8E2CBA2CC3D88E1CBA0C8E09 -:10E250000C181BBA1B8E2CBA2CC3588E0C162CBA59 -:10E260000C8E1C181BBA1B8E2CBA2CC2C88E1C1804 -:10E270001BBA0B8E0CBA1C8E2CBA2CC2488E0C16F4 -:10E280002CBA0C8E1CBA1C8E2C181BBA2BC1B88E43 -:10E290001CBA0C8E0CBA1C8E2C181BBA2BC1388ED3 -:10E2A0000CBA0C8E1C162CBA1C8E2C181BBA2BC048 -:10E2B000A88E1C162CBA0C8E0C162CBA1C8E2C1880 -:10E2C0001BBA2B9A0CAE0C9A1CAE1C9A2CAE2C2F9F -:10E2D000EDE3CF80C00000EBCD40803007E06CC2A2 -:10E2E000C8EA1C8001FEB0C479300CC0B8E06B00F5 -:10E2F00008C9001302F1EC560400E600008001009A -:10E30000E70001000067C8010D02F1EC56030000B0 -:10E310000001003EA8EA1B0000F60C060A580AC0DD -:10E320002030172FFC5C6C58ACCF450E9C5C6CE326 -:10E33000CD8080F80B0B0A5EFD0000D401E06CC2BA -:10E34000D0EA1C8001FEB0C45B300CC098300BE0FA -:10E350006A3EA8EA1A0000F40C0B0B2FFC5C6C5808 -:10E36000ACCF65D80A0000EBCD40E018961697E0D8 -:10E37000A0664C1895E06CC2D8EA1C8001FEB0C4BF -:10E380003F300CC0382FFC5C6C58ACE08400BE30D1 -:10E390001BF60C094BEB1A0066166ACF50302A0F99 -:10E3A00089F2091068EC090B0A0F8AF40A10680C4C -:10E3B0000AB4AC58ACF9BC020A1E0CF93C000AFEC7 -:10E3C0000C001F081526374451626F7C8D9900E0C0 -:10E3D0006A3EA8EA1A00002F6A0F8CF80C10681821 -:10E3E000062FC6158CAC8CC858E0693EA8EA190007 -:10E3F000002F590F8CF80C106818062FC60C983295 -:10E400002A133C10CC201ACFD1C748E0693EA8EAB5 -:10E4100019000000E243001302F1EC560400E7008B -:10E4200000800100E800010000F023010D02F1EC82 -:10E43000560300000001002D390F8CF80C106818ED -:10E44000062FC60C98306A133C10CC201ACFD1C6C8 -:10E4500038E06A3EA8EA1A00002CDA0F8CF80C109B -:10E460006818062FC6158CAC8CC568E06A3EA8EA11 -:10E470001A00002CCA0F8CF80C106818062FC6154D -:10E480008CAC8CC498E0693EA8EA1900002CB90F46 -:10E490008CF80C106818062FC60C98305A133C10D4 -:10E4A000CC201ACFD1C388E06A3EA8EA1A00002C1B -:10E4B0006A0F8CF80C106818062FC6158CAC8CC22D -:10E4C000B8E06A3EA8EA1A00002C5A0F8CF80C102B -:10E4D0006818062FC6158CAC8CC1E8E0693EA8EA26 -:10E4E0001900002C490F8CF80C106818062FC60C68 -:10E4F00098338A133C10CC201ACFD1C0D8E06A3EA2 -:10E50000A8EA1A000028CA0F8CF80C106818062F09 -:10E51000C6158CAC8C0F8C2FFCAE8CEB1C006616D9 -:10E520008CEB5C0066300C29A5AA0C300CE06B3E2D -:10E53000A8EA1B000028BB007228001302F1EC5669 -:10E540000400E80000800100E900010000B098012B -:10E550000D02F1EC56030000000100B68CE3CF8001 -:10E56000E0D7038001B3F480006FE8EBCD40C0201A -:10E570001DE06CC2FFEA1C8001FACBFFFF198AB6CE -:10E580008A199AB69A19ACBA8C3006C0382FF65C44 -:10E5900056E067008C58A6C184E06C0050EA1C006D -:10E5A00000F806000B2F4B178BBA9B0C0C198CBA7A -:10E5B000AC3029FACAFFFFF7D7C008304CFEB0C311 -:10E5C00095CE61300CC1B830181A99305AF7D7C0BF -:10E5D00008304CFEB0C3B6CF601B8CA7BCBA8C30E1 -:10E5E0005CBA9C1B8CBAAC3029FACAFFFFF7D7C0C3 -:10E5F00008304CFEB0C37ACE60301C2FFDE3CD80D6 -:10E60000C00000EBCD40C0201DE06CC2E0EA1C80E1 -:10E6100001FACBFFFF198AB68A199AB69A19ABBAD2 -:10E620008B2FCCFEB0C310305CBA9CE06C0080BA7B -:10E63000ACE067008C3029FACAFFFFF7D7C008307A -:10E640004CFEB0C353C031300CC3B8322CFEB0C541 -:10E65000633006C1E85836C1A05846003B6200133B -:10E6600002F1EC560400E90000800100EA0001001C -:10E67000002553010D02F1EC56030000000100C11A -:10E68000805856C160E06C0050EA1C0000F806009B -:10E690000B2F4B178BBA9B0C0C198CBAAC3029FA88 -:10E6A000CAFFFFF7D7C008304CFEB0C331CDF02F02 -:10E6B000F65C5658A6CE2530181A99305AF7D7C0AE -:10E6C00008304CFEB0C350CD201B8CF9DCC007BA1B -:10E6D0008C30191A9AF7D7C008304CFEB0C318CC4A -:10E6E00060301C2FFDE3CD80C00000EBCD408020CA -:10E6F0001DE06CC2E8EA1C8001FACBFFFF198AB664 -:10E700008A199AB69A19ABBA8B2FCCFEB0C2AEE07A -:10E7100067008C30181A99305AF7D7C008304CFE71 -:10E72000B0C322C031300CC1B81B8CA7BCBA8C302E -:10E730005CBA9C1B8CBAAC3029FACAFFFFF7D7C071 -:10E7400008304CFEB0C2E4CEF0E0A06495F93C0085 -:10E7500084580CC041322CFEB0C500301C2FFDE3A4 -:10E76000CD8080EBCD4080201DE06CC31AEA1C8078 -:10E7700001FACBFFFF198AB68A199AB69A19AC002A -:10E780005AE3001302F1EC560400EA000080010095 -:10E79000EB000100009AE8010D02F1EC56030000C5 -:10E7A000000100BA8CE067008C30181A99305AF7D3 -:10E7B000D7C008304CFEB0C2E9C031300CC1B81B24 -:10E7C0008CA7BCBA8C305CBA9C1B8CBAAC3029FAD2 -:10E7D000CAFFFFF7D7C008304CFEB0C2ABCEF0E0A6 -:10E7E000A0645CF93C0084580CC041322CFEB0C4DB -:10E7F000C7301C2FFDE3CD80800000EBCD40802092 -:10E800001D1897E06CC2F0EA1C8001780C500C30A7 -:10E81000480E99301AE06B008C304CFEB0C2B6C086 -:10E8200031300CC1A80E9CC1ECFEB0C115793C582A -:10E830001CC1211A9C0F8BB88B0F9BB89B0FABB8D8 -:10E84000AB0FBBB8BB1B9CAE8C1B8CAE9C1BBCAE79 -:10E85000AC1BACAEBC301C2FFDE3CD8080D7038059 -:10E86000006DB0EBCD40E0201DE067C18CEA178061 -:10E87000011A9B0F8AB68A0F9AB69A300AC098304E -:10E8800008939872995839C035301997E92FFAE0F2 -:10E890006B0050EA1B0000584AC1341699F20A0076 -:10E8A00029F80A0010FD001302F1EC560400EB00F9 -:10E8B00000800100EC000100008EC0010D02F1ECAF -:10E8C0005603000000010007085808CEC172982FB7 -:10E8D000F893987298E05886A1CE75E07886A09358 -:10E8E00098CE3B76EC580CC43076DC580CC4013022 -:10E8F0001C97DCE06600FFBA86354CBA9CE06500E8 -:10E900008C30291A9AF7D5C008304CFEB0C224BA10 -:10E910008634DCBA9C30291A9AF7D5C008304CFEF0 -:10E92000B0C21A345CBA8C305CBA9C30291A9AF79F -:10E93000D5C008304CFEB0C20F344CBA8C340CBA7F -:10E940009C30291A9AF7D5C008304CFEB0C2043466 -:10E950005CBA8C300CBA9C30291A9AF7D5C00830B2 -:10E960004CFEB0C1F92FC70E9CFEB0C1A32FFDE332 -:10E97000CF80E0D401201D198BE06A0050EA1A0014 -:10E9800000B4AB198C500CE06CC21CEA1C8001FE78 -:10E99000B0C1902FFDDA0AD401585CC051169CCE4C -:10E9A000AFC021D80ADA0AD401E06BBE50EA1B805E -:10E9B00001304CE0A04D82D80A0000EBCD40E020B1 -:10E9C0001DE06CC311EA1C00BD37001302F1EC56C8 -:10E9D0000400EC0000800100ED00010000E478017B -:10E9E0000D02F1EC560300000001008001FACBFF9C -:10E9F000FF198AB68A199AB69A19ACBA8CE0A06344 -:10EA00007118973005C0382FF55C55E066008C58BA -:10EA1000A5C174E06C0050EA1C00000A0CF93B0030 -:10EA20000CBA9B2E8C198CBAAC3029FACAFFFFF7AE -:10EA3000D6C008305CFEB0C1A1CE71300CC4183015 -:10EA4000181A99305AF7D6C008305CFEB0C1C2CF50 -:10EA5000601B8CA1ACBA8C305CBA9C1B8CBAAC30FD -:10EA600029FACAFFFFF7D6C008305CFEB0C186CED7 -:10EA7000603018FAC9FFFF300AF7D6C008305CFED4 -:10EA8000B0C1A8CDC01B8CA7BCBA8C305CBA9C1B93 -:10EA90008CBAAC3029FACAFFFFF7D6C008305CFE4A -:10EAA000B0C16CCCC0300A300B300CFEB0C428EFC3 -:10EAB0003C0084580CC041322CFEB0C385301C2F62 -:10EAC000FDE3CD80E00000D421202DE066BF38EAD0 -:10EAD000168001FACCFFFC0D8BB88B0D9BB89B0DFB -:10EAE000ACBAEC0C9C2FCCFEB0C0F60097710013B2 -:10EAF00002F1EC560400ED0000800100EE00010080 -:10EB00000071B3010D02F1EC560300000001003268 -:10EB10002CFEB0C35B3005C0382FF55C5558A5C13D -:10EB2000D45865CFB05875CF905885CF70E0670046 -:10EB300050EA1700000A07EF3C000CBACC2E870FF2 -:10EB40008CBADC3029FACAFFFCE06B008C305CFE2A -:10EB5000B0C126CE31300CC988E0670050EA1700FA -:10EB6000006EDC500C0C9C2F8CFEB0C0C7E0650022 -:10EB70008C6EDC581CC461E06400FFBAC4354CBA2A -:10EB8000DC3029FACAFFFCF7D5C008304CFEB0C112 -:10EB900007CE20BAC434DCBADC3029FACAFFFCF74D -:10EBA000D5C008304CFEB0C0FBCD60345CBACC3070 -:10EBB0005CBADC3029FACAFFFCF7D5C008304CFE3D -:10EBC000B0C0EECC90344CBACC3004BAD43029FA70 -:10EBD000CAFFFCF7D5C008304CFEB0C0E1CBC03452 -:10EBE0005CBACCBAD43029FACAFFFCF7D5C00830D9 -:10EBF0004CFEB0C0D5CB002EC60C9CFEB0C07E8FA4 -:10EC0000D43018FAC9FFFA305AF7D5C008305C0082 -:10EC10009E75001302F1EC560400EE000080010026 -:10EC2000EF00010000CE08010D02F1EC56030000D8 -:10EC3000000100FEB0C0F2CA101BECF9DCC007BA3C -:10EC4000EC3019FACAFFFAF7D5C008305CFEB0C044 -:10EC5000B9C9403018FAC9FFFA305AF7D5C00830A0 -:10EC60005CFEB0C0DBC8A01BECA1ACBAEC305CBA57 -:10EC7000CC1BECBADC3029FACAFFFCF7D5C008304F -:10EC80005CFEB0C09FFE90FF7A3018FAC9FFFA30E0 -:10EC90000AF7D5C008305CFEB0C0C0FE90FF6F30F0 -:10ECA0000A301B300CFEB0C34F301C2FEDD8228031 -:10ECB0000074B8EBCD4080201DE06CC2A8EA1C8037 -:10ECC00001FACBFFFF198AB68A199AB69A19ABBA1C -:10ECD0008B2FCCFEB0C024E067008C30181A99301E -:10ECE0005AF7D7C008305CFEB0C098C031300CC2B3 -:10ECF000081B8CA7BCBA8C305CBA9C1B8CBAAC309D -:10ED000029FACAFFFFF7D7C008305CFEB0C05ACE60 -:10ED1000F0300A300B300CFEB0C316E0A06206F9EA -:10ED20003C0084580CC041322CFEB0C271301C2F04 -:10ED3000FDE3CD006347001302F1EC560400EF0041 -:10ED400000800100F000010000DE60010D02F1EC26 -:10ED5000560300000001008080D70380006FE88028 -:10ED6000007610800074D8EBCD4080201DE06CC38D -:10ED700002EA1C8001FACBFFFF198AB68A199AB6FB -:10ED80009A19ACBA8CE067008C30181A99305AF78F -:10ED9000D7C008305CFEB0C053C031300CC1481B36 -:10EDA0008CA7BCBA8C305CBA9C1BAB1B8C184BBAC2 -:10EDB000AB3029FACAFFFFF7D7C008305CFEB0C0FD -:10EDC00013CED0301C2FFDE3CD8080EBCD40C0189A -:10EDD00097E06610CAEA16000030180C99304AE035 -:10EDE0006B008C305CFEB0C02BC031E3CF80C00D17 -:10EDF0008CE06B10CBEA1B0000B68CAE8CE3CF909E -:10EE0000C0D703800070E4EBCD4080201D1A9C30F9 -:10EE10000BB88BB89BE0A0619B308BBA8BF93C00A0 -:10EE200082BA9CE067008C30291A9AF7D7C0083064 -:10EE30005CFEB0BFD9C031300CC0E8309CBA8C3019 -:10EE40000CBA9C30291A9AF7D7C008305CFEB0BFC4 -:10EE5000CBCF30301C2FFD007D5A001302F1EC5651 -:10EE60000400F00000800100F100010000CADD0193 -:10EE70000D02F1EC56030000000100E3CD8080801C -:10EE800001B3F48000708CEBCD4080E067BE74EA83 -:10EE90001780010E9B305CE0A04B6A0E9B308CE02B -:10EEA000A04B66E3CF8080800187F0D431202D18FD -:10EEB00097E065176CEA1500008ACC160CAA4C8AFC -:10EEC000DC160CAA5C0BEC599CC0940BEC2FFCAA32 -:10EED000EC0E9CE0A02388EAEB013C3016EA1643D6 -:10EEE000FA0E9C0C9BE0A01209E0830131EAF401C8 -:10EEF000F4089C0C9BE0A01201E08301290BEC5963 -:10EF00009CE08501258ACCE04C00AFE08501200E15 -:10EF10009C089BE0A00FACE0640090EA140000891C -:10EF20002CEB4701F4E0A0235FBFDBE068999BEA8C -:10EF3000189999E0699999EA193FC9E0A02372C02C -:10EF400063EAEA013CE0A0118F18970B9C580CC0B3 -:10EF500061EB4701F8EB4701FCC4A86806FC133FCE -:10EF6000F00E9CE0A02340149016910C9CE0A0238E -:10EF70003B14981699300A069BE0A0006D9A001386 -:10EF800002F1EC560400F10000800100F2000100E3 -:10EF9000005F16010D02F1EC560300000001002194 -:10EFA0006300980299E0A022A814901691EAFC014F -:10EFB000F80C9BE0A01032E0A0232800980299E012 -:10EFC000A02186E0A01162EB4C01F86816E0A023B6 -:10EFD0001D149016910C9CE0A023181498169930DB -:10EFE0000A069BE0A0214000980299E0A022851427 -:10EFF000921693EAFC01FC0C9BE0A0100FE0A0230A -:10F000000504980699E0A02163E0A0113FEB4C01B4 -:10F01000FC8ADCE04C03E9C185EAFC01FC0BABEAAD -:10F020000B002BF74C01540BAC2FFCAAAC0BAC59CA -:10F030004CC031300CAAAC0BBC594CC0440BBC2F9B -:10F04000FCAABC300CAA5C0B860C90EA0000210BD9 -:10F050009C594CC2716374089CE0A022D714981686 -:10F0600099EAEA0124E0A020FFEAEB0124089C08C9 -:10F070009BE0A00FD3E0A022C914981699EAEA01F8 -:10F080002CE0A020F1EAEB012CE2FC00D4E0A0226D -:10F09000BD14981699EAEA0134E0A020E5EAEB00F5 -:10F0A000CBA9001302F1EC560400F200008001002D -:10F0B000F300010000E0AD010D02F1EC5603000089 -:10F0C0000001000134E347005C0E9CE0A022B0EA9E -:10F0D000E80124E0A0210EEAEB01240E9C0E9BE047 -:10F0E000A00FAEE0A022A4EAE8012CE0A0210214C7 -:10F0F000921693EAE3012CF5D6C0080B9B0A9C2AD2 -:10F100004CC99DE34C00D4E0A02292EAE80134E02F -:10F11000A020F014961697EAE70134EAFC01FC837C -:10F120003C8ACCEA00001BF75C00AC0B9C594CC03D -:10F13000440B9C2FFCAA9C0B9CE0A022EB14901685 -:10F1400091EAEA012400980299E0A02225EAEB0165 -:10F150003C14981699E0A021E2BB1B049A069B0080 -:10F16000980299E0A02218BB08E0A0208FEAEB01EA -:10F17000440C9A0E9B00980299E0A0220DEAEB0144 -:10F180004C0B8C2FFCAA8C300C0B8B594BC021AA3A -:10F190008CAA4C2FEDD83A800134C4D631202D30C2 -:10F1A000033007300C501C3005500CE066176CEA39 -:10F1B0001600000D925942E08101300DBC585CE010 -:10F1C00085012C009C50001302F1EC560400F30062 -:10F1D00000800100F400010000F485010D02F1EC53 -:10F1E00056030000000100403C301BE0A010BCE0D2 -:10F1F000830126ECE00144E068999AEA189999E0C5 -:10F20000699999EA193FA9009A029BE0A02242C09D -:10F2100062E064126FEA143B03C248E068999AEA1C -:10F22000189999E0699999EA193FA9009A029BE017 -:10F23000A0222EC133009A029BE0686666EA186637 -:10F2400066E0696666EA193FE6E0A02223C062E054 -:10F25000649BA6EA143B44C058E064CCCDEA143D5C -:10F26000CC0DAB169C201C580CC0242ECC204B5827 -:10F270000BC0242ECBEC0C002CF8FC0154EC0B0042 -:10F280002BF6FB0154E0A00E29E0A021E3BFDBE058 -:10F29000A01020E06BC290EA1B3CF5E0A01064C116 -:10F2A00043ECEA014CBFDB14901691089CE0A021CE -:10F2B000D100980299E0A021EDC072F7D2C0080DEC -:10F2C0008C201CC3CD18935C535813E08500B330D9 -:10F2D0000BC088EC0B001CF91C00AC18075C772FE6 -:10F2E000FB5C7B594BCF7500F831001302F1EC56F3 -:10F2F0000400F40000800100F5000100009E3D01C3 -:10F300000D02F1EC56030000000100403CE0A0219A -:10F31000B3E0689204EA186FB0E0691127EA193F78 -:10F3200091E0A02120E0A00FE718945C770E9CE00C -:10F33000A02214E068A9FCEA18D2F1E069624DEA63 -:10F34000193F50E0A0210FE0A00FD6089BE0A00ECF -:10F350009B18940D8A149C201C580CC0242ECC0D94 -:10F360009B142B580BC0242ECBEC0C002C783CECBF -:10F370000B002B763BE0A00DC3FC1BBF80E0A00E72 -:10F3800083E0A02179E0681EB8EA18EB85E069B84F -:10F3900051EA193FBEE0A02123E0A00FAD18970865 -:10F3A0009BE0A00FF3C0333007C1480E9C0E9BE0DA -:10F3B000A00E6A1893089C089BE0A00E65069BE0CF -:10F3C000A00D9EE0A02158E0A05058E0A00F94505E -:10F3D0001C401B0E9CE0A00ECB0DCBEC0B002BF7C2 -:10F3E0004C01A40DCC2FFCACCC0DCC594CC0313011 -:10F3F0000CACCC0DDC594CC0440DDC2FFCACDC302B -:10F4000007C0B85C77EC07002CF8FC00CD46001371 -:10F4100002F1EC560400F50000800100F600010046 -:10F42000000BF6010D02F1EC560300000001000193 -:10F43000A40A9BE0A00DE418952FF70DDCF807193E -:10F4400000CF33E0A00FFC1897FC1C41200A9BE082 -:10F45000A00E2C0E9BE0A00E9DE0A0211FE068995D -:10F460009AEA189999E0699999EA193FB9E0A020B8 -:10F470008CE0A00F53500CC048300CACCCACDC403E -:10F480000CC028300C2FEDDC32D703800138A4806B -:10F490000138A88001394C8001966C80013756D51F -:10F4A000311890149230043005300130063007C214 -:10F4B000685943C02521430E9CE0A00FD7089BE06C -:10F4C000A00D9E1894E0030023660C0A9BE0A00D9B -:10F4D0009718950E9CE0A00FC9660BE0A00DE60200 -:10F4E0009BE0A00D8D1891EE07024CE0A00FBE0C22 -:10F4F0009BE0A00D8518962FF75C571BFC1837C0B2 -:10F50000941BF304230E032FF35803CD342EC3CDE5 -:10F510004B089C089BE0A00DC918971BFCE0A00FAE -:10F520008F0C9BE0A00DC20E9BE0A00CFBE0A000A6 -:10F53000CD2B001302F1EC560400F6000080010010 -:10F54000F700010000B44D010D02F1EC560300007C -:10F5500000010020B5E068ED8DEA18A0B5E069C6AD -:10F56000F7EA193EB0E0A01F0D14961697089C0A02 -:10F570009BE0A00DAD18951BFCE0A00F73029BE073 -:10F58000A00DA60A9BE0A00CDFE0A020990C980E2D -:10F5900099E0A02049E0A00ED3D93280011638802E -:10F5A00001352C800137D0EBCD40FE1894169330F6 -:10F5B000075804C0342EC4C0485944C025214430E3 -:10F5C0000630053002C0C8E06B126FEA1B3B030235 -:10F5D0009CE0A00EFFC0332FF55C752FF2E803010D -:10F5E0000B5C52069C201C1832C264040B2FFB5883 -:10F5F0000BC0342ECBC048594BC025214B169C2F35 -:10F60000FC594CC025214CE06A176CEA1A0000F442 -:10F610000C002C783CF40B002A743BE0A00C9418EE -:10F6200091E06B126EEA1BBB03E0A00EDFCCD22F81 -:10F63000F65C76CD4B2FFB580BC0242ECBE06A171F -:10F640006CEA1A0000F404002C783CF40B002A74D5 -:10F650003BE0A000B205001302F1EC560400F700F5 -:10F6600000800100F80001000023A6010D02F1EC6A -:10F67000560300000001000C79E0A02033BFDBE05E -:10F68000A00E7018945C7558B5C125E06BC290EA65 -:10F690001B3D75E0A00EB0C0B3E06BCCCDEA1B3EC5 -:10F6A000CC089CE0A00EB4C0323017C1585C76582C -:10F6B000B6C125E06BC290EA1B3D75089CE0A00E28 -:10F6C0009BC0A3E06BCCCDEA1B3ECC089CE0A00E17 -:10F6D0009FC02230270E9C5C5CE3CD80FED7038068 -:10F6E000013868800114E88001157C80011594EBD5 -:10F6F000CD42FF18951697149310913002300630C2 -:10F7000004C0E8401C5C54081C580CC0240E0CEAD1 -:10F710000C032C049BE0A00C9718922FF4E604181D -:10F7200000CF13069CE0A00EAF189B049CE0A00D38 -:10F7300055830C3004C1B8401B5C54089C162C58EF -:10F740000CC0240E0CEA0C0022620C640BE0A00C2E -:10F750000D1890620C640BE0A00C08009BE0A00C5C -:10F76000C90C9BE0A00C7018962FF4E6041800CE8C -:10F7700043069CE0A00E88003C9A001302F1EC5670 -:10F780000400F80000800100F900010000631D0181 -:10F790000D02F1EC56030000000100189B0C9CE0E8 -:10F7A000A00D2E40AB970CE3CF82FF800110F080BC -:10F7B000011278800111CC8001160C80011360D4F5 -:10F7C00001FEB0BA452D5C198C580CC2C0E06C3FEC -:10F7D00020EA1C0000785BF72A0021581AC0652F28 -:10F7E0003B178B581BC025DA0A787BF72A00215873 -:10F7F0001AC0552F3B178B581BCF74786CF92B0010 -:10F8000021581BC205F93B000D581BC1C5F92B003F -:10F8100013584BC0512D8C980C581CCE64585BC1AA -:10F8200021DA0A300CC0C8E06B3F20EA1B0000F66A -:10F830000C032B2F3B178B581BCD742FFC5C6C5883 -:10F84000ACCF35D80A0000D401189BF73C000D5806 -:10F850005CE084013CF7290004F73C000DF72A0026 -:10F86000005C5A589AF9BA0205FE0A001A94CA14A2 -:10F870000F00140058009C00E0015A057E021C0194 -:10F88000A801FEE06A2624EA1A0000F80C10061807 -:10F890000A762CF809041CF55C007800063A00137F -:10F8A00002F1EC560400F90000800100FA000100AA -:10F8B00000F6D6010D02F1EC5603000000010076BF -:10F8C0002CF738000C1208F808041CF55C007A7656 -:10F8D0002CF738000CF2080019F809041C284AB467 -:10F8E0000C2F3B178C2FFCB68CD80AE06A2624EA32 -:10F8F0001A0000F80C1006180A762CF809041CF5FA -:10F900005C0098762CF738000C1208F808041CF5F7 -:10F910005C009A762CF738000CF2080019F80904FC -:10F920001CF55C009C2F3B178C2FFCB68CD80AE092 -:10F930006A2624EA1A0000F80C1006180A762CF839 -:10F9400009041CF55C00B8762CF738000C1208F896 -:10F9500008041CF55C00BA762CF738000CF208009D -:10F9600019F809041CF55C00BC2F3B178C2FFCB662 -:10F970008CD80AF2081501762A100A940A580AC18E -:10F9800031762AF73E000C120EF40E041A580AC003 -:10F99000B1762AF73E000CF20E001EF40E041A583F -:10F9A0000AE0800238A37CE06A2624EA1A000014E8 -:10F9B0000C762AF408040AA96AF94A0050762A004B -:10F9C000D2A7001302F1EC560400FA0000800100F7 -:10F9D000FB00010000496D010D02F1EC560300002F -:10F9E000000100F738000C1208F408041A794814D2 -:10F9F00008F9480050762AF738000CF2080019F48C -:10FA000009041A2ACCB80A2F3B178C2FFCB68CD8C5 -:10FA10000AA37CE06A2624EA1A0000140C762AF471 -:10FA200009041AB80A762AF738000C1208F40804F8 -:10FA30001AB81A762AF738000CF2080018F40804ED -:10FA40001AB82A762AF738000C303EF00E0349F433 -:10FA500009041AB83A2F3B178C2FFCB68CD80AA38E -:10FA60007CE06A2624EA1A0000140C762AF40904C1 -:10FA70001AF95A0028762AF738000C1208F40804FC -:10FA80001AF95A002A762AF738000CF2080018F4FE -:10FA900008041AF95A002C762AF738000C303EF088 -:10FAA0000E0349F409041A2D2CB80A2F3B178C2F8A -:10FAB000FCB68CD80A762AF409041AE0692624EAEE -:10FAC000190000120CF96A00F82F3B178C2FFCB6B6 -:10FAD0008CD80AE06A2624EA1A0000F80C100618EE -:10FAE0000A762C00A507001302F1EC560400FB0077 -:10FAF00000800100FC000100005D45010D02F1ECF9 -:10FB000056030000000100F809041CF55C00D876DB -:10FB100028F73C000C1809F009041CF55C00DAF722 -:10FB20000C0028581C5F4CF56C00DC2F3B178C2F09 -:10FB3000FCB68CD80AF73C000D585CE081018FF7C9 -:10FB4000290004F72C00005C5C589CF9BC02052FCE -:10FB5000ECFE0C001FC098C388C678C968CC28C7C3 -:10FB6000A9C4A9CF78C3393018C128F00C100618E1 -:10FB70000AF50C0078F55C0072F50C007AF55C0073 -:10FB800074F50C007C28AAB40C2FF85C68E06A2697 -:10FB900024EA1A00005858CEA5762CF809041CF562 -:10FBA0005C0090762CF738000C1208F808041CF55D -:10FBB0005C0092762CF738000CF2080019F8090462 -:10FBC0001CF55C0094C4793018C128F00C1006189C -:10FBD0000AF50C0098F55C0092F50C009AF55C00B3 -:10FBE00094F50C009CF55C00962FF85C68E06A26A2 -:10FBF00024EA1A00005858CEA5762CF809041CF502 -:10FC00005C00B0762CF738007E6A001302F1EC56E7 -:10FC10000400FC0000800100FD0001000037FD0130 -:10FC20000D02F1EC56030000000100000C1208F870 -:10FC300008041CF55C00B2762CF738000CF20800C2 -:10FC400019F809041CF55C00B4C1793018C128F01A -:10FC50000C1006180AF50C00B8F55C00B2F50C00A3 -:10FC6000BAF55C00B4F50C00BCF55C00B62FF85C8E -:10FC700068E06A2624EA1A00005858CEA5762CF8C7 -:10FC800009041CF55C00D0762CF738000C1208F83B -:10FC900008041CF55C00D2762CF738000CF2080042 -:10FCA00019F809041CF55C00D4CE78301CC0C8F4E7 -:10FCB0000C003A7548F5480048F50800542B4AB442 -:10FCC000082FFC5C6CE06A2624EA1A0000585CCF1E -:10FCD00005762CF809041CA96CF54C0070762CF7FD -:10FCE00038000C1208F808041C75C81808F54800FC -:10FCF00070762CF738000CF2080019F809041C285B -:10FD0000CAB40CCBA8301CC108F40C003A149820DB -:10FD100088940EB00E2FEA940EB01E941EB02E944E -:10FD20002AB03A2FFC5C6CE06A262400D76E0013E0 -:10FD300002F1EC560400FD0000800100FE0001000D -:10FD400000A236010D02F1EC56030000000100EAAA -:10FD50001A0000585CCEC5762CF809041CF55C002E -:10FD600020762CF738000C1208F808041CF55C000B -:10FD700022762CF738000CF2080018F808041CF55D -:10FD80005C0024762CF738000C303EF00E0349F866 -:10FD900009041C2DAAB40CC828301CC158F40C004E -:10FDA0003AF5080028F5580020F508002AF5580013 -:10FDB00022F508002CF5580024F508002E2DAAB4D1 -:10FDC000082FFC5C6CE06A2624EA1A0000585CCE1E -:10FDD00075762CF809041CF55C0048762CF7380081 -:10FDE0000C1208F808041CF55C004A762CF7380061 -:10FDF0000CF2080018F808041CF55C004C762CF78F -:10FE000038000C303EF00E0349F809041C2B2AB4CC -:10FE10000CC458301CC088180AF53800F8F5680082 -:10FE2000F72FFC5C6CE06A2624EA1A0000585CCFCD -:10FE300045762CF809041CF56C00FCC3083018C189 -:10FE400028F00C1006180AF50C00D8F55C00D2005A -:10FE500099F0001302F1EC560400FE00008001004E -:10FE6000FF000100001D8D010D02F1EC56030000A2 -:10FE7000000100F50C00DAF55C00D4F53C00DCF57F -:10FE80006C00D62FF85C68E06A2624EA1A00005855 -:10FE900058CEA5762CF809041CF55C00F0762CF7FA -:10FEA00038000C1208F808041CF55C00F2762CF7F8 -:10FEB00038000CF2080019F809041CF56C00F43045 -:10FEC0005C2F3BB68CD80AEBCD40801897FEB0B7BC -:10FED0002BEDB70002C382E06B3F20EA1B000076E7 -:10FEE0005B179A581AC305F73A000DE0692724EA10 -:10FEF000190000585AC0F4F20A0019F93A0043B246 -:10FF00008A2BCC198CB29C2F3B178C2FFCB68CE320 -:10FF1000CF8080301AC0B8F20A0018109E202E112F -:10FF200087BC871198BC982FFA5C6A585ACF55F94C -:10FF30003A0043F36A00082BCC198C2F79B28C302D -:10FF40005C2F3BB68CE3CF8080D70380006DB0D5AB -:10FF500031209D300BBACBE0670E88EA170000789D -:10FF60000B8F0B781B8F1B782C8F2C3005300C508F -:10FF70004C508C0015DF001302F1EC560400FF001A -:10FF800000800101000001000058E5010D02F1ECC4 -:10FF900056030000000100507C506C305A0E9B2F1D -:10FFA0008B6E3CE0A0025C305A0E9B2FCB6E4CE077 -:10FFB000A00256305A0E9B6E5CE0A002513059FAF6 -:10FFC000CAFFF0303B6E3CE0A0026018903059FA56 -:10FFD000CAFFE0303B6E4CE0A0025818913059FA4D -:10FFE000CAFFE4303B6E5CE0A00250505C305A30F7 -:10FFF0003B6E3CE0A00292FC1B4040E0A0097E501A -:020000021000EC -:100000002C6E146E02300B049CE0A05867C0E130E7 -:100010000B089CE0A05862C0916E2C300BE0A058F9 -:100020005DC041E0A0021430153003E0660008EA2C -:100030001600000D9C503C6E2B169CE0A008EA5068 -:100040000C089C089BE0A008E51894049C049BE025 -:10005000A008E0089BE0A00887400BE0A00884E02F -:10006000A01BD0E0A04AD0E0A00A0C500C305A1AD5 -:100070009B6E6CCF4D400CE06B0CDDEA1B40FBE04F -:10008000A00A56C093400CE06B49A7EA1B413CE034 -:10009000A00A42C043CDBD0096BF001302F1EC564A -:1000A000040100000080010101000100005408016A -:1000B0000D02F1EC56030000000100300CCD783049 -:1000C00059FACAFFE8303B6E6CCF1DFC1B4060E064 -:1000D000A00A40CF32E06B6667EA1B3FE6009CE077 -:1000E000A00A38CEB2402CE06B1B3EEA1B4130E048 -:1000F000A00A30C152402CE06BB4D7EA1B4109E0A2 -:10010000A00A1CC0D30D9CE04C00FFCD70E06C0039 -:10011000FFAC9C3FFC40ABB68C301CCA88402CE046 -:10012000A01B82BFDB3008FC194010E0A01B9CC65E -:1001300062FC144000029C089BE0A00A0BC5323010 -:10014000056E2C400BE0A008EBE0A01B6DE0A04981 -:100150006DFC188000E069A5DCEA19404CE0A01AAB -:10016000DAE0A054C5E0A01BAA8D2C5C55C5816CBB -:100170002C5C4CE04C003DCA146E1CE0A01B5414D7 -:10018000981699109412956E0CEE1C8000E0A01B3E -:100190004B08980A99E0A04BB9FC188000E069A5CB -:1001A000DCEA19C04CE0A01AB6E0A054A1E0A01B04 -:1001B0008618935803C034FE33FE9800D974001398 -:1001C00002F1EC560401010000800101020001006F -:1001D00000C1C3010D02F1EC56030000000100064E -:1001E0009C2D3C35ABF80B0C045844C02130046CFA -:1001F000270E9B089CC67CC0600E9A069B089CC775 -:100200002CC1C1C48DC1E8029C089BE0A009A8FED6 -:1002100092FF67405C089BE0A009A2CA53C60B305E -:1002200059FACAFFF0305B6E3CC53DFC1B3F80E0D5 -:10023000A009A2FE92FF55C96B0DAC083CC020ACD2 -:10024000A40DAC403B163CC051403BE04B00FFC10D -:10025000F16C276C1BE21B0006C030301CC0480E3E -:100260009A069BC82C5C47E047003DC1145C5CC00B -:10027000F00DAC0D9BF80B1800C0A0AC9C40ABB6C9 -:100280008C301BBACBE04C00FFC020AC8C1BCC2FB9 -:100290007DD9328001B1408001966C800114E880E4 -:1002A0000138A88001946C800138688001994C80E5 -:1002B0000137568001AB30800138FE8001157C800B -:1002C000011594E06A0018EA1A0000F40C003A7470 -:1002D0000C183BC055741C163C5F4CC028300C00F9 -:1002E000A89A001302F1EC560401020000800101FB -:1002F00003000100007E78010D02F1EC56030000BE -:100300000001005C5C5EFCD401E0690008EA1900B1 -:100310000013887219E2190006C030C38CD8025845 -:1003200008C335103CC0C0109A2FFAF4091401BF5D -:10033000891409A349F409012A143CC101F80A10DF -:100340005A228A580CC091E04B013BC085FE3AFE10 -:1003500098143BC044D80A143BCFE5103CC0B02FE2 -:10036000D8F00A1401BF8A100AA34AF00A01281023 -:100370003CC0B1F80A105A2D8A580CC041E04B001D -:100380002EC034163ACE85DA0A0000EBCD40F821B3 -:100390000DE06E0008EA1E00001D85E067BB18EA4C -:1003A0001780011A990E983144110612A62044CFE5 -:1003B000D13006401914985C4840040838C05514E0 -:1003C000985C481238C0B5402814965C461236C373 -:1003D0000514995C491039C2C430165805C68558B1 -:1003E0000CC3C50A3CC0C00A9A2FFAF4091401BF15 -:1003F000891409A349F409012A143CC3511A940E23 -:100400009A2ECA002F5A001302F1EC560401030081 -:100410000080010104000100006A50010D02F1ECAE -:10042000560300000001003403B509A9282083CF3A -:10043000D1EC0A15041A99120A580CC23174091227 -:100440003BC244741A163AC214E06C00FFBCAC30D4 -:100450000CC418403914965C461036C07514985C6C -:10046000481238C0343026CCCB14985C481238C0BF -:100470007540495C4A1439C0353036CC2B300CC23B -:10048000A8F40C032A143BCE150A3CC0B02FD5EAC1 -:100490000A1401BF8A0A0AA34AEA0A01250A3CC1D2 -:1004A000911A9A2AC73405AF09B5282085CFD1A55E -:1004B000660C9A1A99120A580CC081740C163CC02A -:1004C00094743C183BC064CC1BF40C032C163CCB3E -:1004D000D5301C2F0DE3CD80F80000E06C00FFE06C -:1004E0006B0008EA1B0000B6AC5EFD9889F40919A0 -:1004F00000C0333009B80998892FF9B8099889F4F0 -:10050000091900C033300AB80A760B988AF80A0035 -:100510002C991B5EFF0000D431201D1896169114F3 -:1005200090129430053003001A45001302F1EC5686 -:100530000401040000800101050001000000E80141 -:100540000D02F1EC560300000001008C875C87026D -:100550009CE0A008991892F5D4C010F7D1B0100C07 -:100560009CC35C049BE0A00723810CC05808972023 -:10057000175C872FF3E2031900C184EC07002264A3 -:100580001C600BE0A005DC500C641C600BE0A005B7 -:10059000D7400BE0A006980A9BE0A0063F189558AC -:1005A00017CE6520175C87CE6B029CE0A0086C1804 -:1005B0009B0A9CE0A006FC2FFDD832800110F08041 -:1005C0000112788001163880011360EBCD40F818D5 -:1005D0009516971496300C30048A83C1085C8358B2 -:1005E00003C075EA03002B761BE0A0061720135CFE -:1005F000835803C0340C9320132FF4EE041900CE5B -:10060000F5E3CD80F8D703800111CCEBCD40C020BD -:100610006D1A9C300A300BB91BF8EB0008F8EB00A0 -:1006200010E06600EE30181A99E06A00D0F7D6C0E4 -:1006300008303CFEB0B57E1B8BE04B0055C67158B0 -:100640001CC651E0670F04EA1700000036A900132A -:1006500002F1EC56040105000080010106000100D2 -:10066000009523010D02F1EC56030000000100305B -:100670004C8F7C303CEF5C0020EF5C0022355CEF5F -:100680006C001631681A99E06A00AAF7D6C00830E3 -:100690003CFEB0B561C0412FADE3CD80C01B8A1BCD -:1006A0009BF7EA108AAE0A1BAA1BBBF7EA108AAEB8 -:1006B0001A1BCA1BDBF7EA108AAE2A1BEA1BFBF7E0 -:1006C000EA108AAE3AFB3A0008FB3B0009F7EA1051 -:1006D0008AAE4AFB3A000AFB3B000BF7EA108AAEEF -:1006E0005AFB3A000CFB3B000DF7EA108AAE6AFB9E -:1006F0003A000EFB3B000FF7EA108AAE7AFB3A0095 -:1007000010FB3B0011F7EA108AEF5A0010FB3A0089 -:1007100012FB3B0013F7EA108AEF5A0012FB3A0073 -:1007200014FB3B0015F7EA108A2EC7AE0ACB5B30EC -:100730000CCB3BEBCD4080201D1A9C300BB88BB806 -:100740009BE0670038EA170000300C8F0CAECC300D -:100750001C8F3CE06C00F4BA8C32ECBA9C30291A45 -:100760009AE06B00EE303CFEB0B4CA0E9B2F0B003B -:10077000FB65001302F1EC56040106000080010144 -:1007800007000100002A98010D02F1EC5603000059 -:10079000000100300A970AB6CA300B2F87AE8B2FA4 -:1007A000FDE3CD80800000D401201D1A9C300BB8E1 -:1007B0008BB89BE06C00F4BA8C32ECBA9C30291AEE -:1007C0009AE06B00EE303CFEB0B4AC2FFDD802EBEB -:1007D000CD4080187CC050201CC190E3CF9080E0B9 -:1007E000670038EA1700000E9C2F0CCC4CC2010F9A -:1007F0008C580CC0410F9C580CC1A0300CE06B0011 -:1008000038EA1B0000973CE3CF9080E0670038EAAD -:100810001700000E9C2EECC8ACC0A10FAC580CCE3B -:10082000E10FBC580CCEB10FCC580CCE81E3CF9069 -:10083000800000EBCD40C0202D18973006300C50C2 -:100840001C5C5BC0A0E06C0F04EA1C0000786CF339 -:10085000BC0004501CC1781A9C300BB88BB89B307C -:10086000281A99E06A00F6E06B00EE303CFEB0B466 -:100870008518965816CF511B8C1B9BF7EC108CCD0E -:10088000CC501C401CF80C100A501C401CA94CAE4B -:10089000CC401C003314001302F1EC560401070095 -:1008A000008001010800010000BD73010D02F1ECA0 -:1008B00056030000000100AEDC0C9C2FEDE3CD8060 -:1008C000C00000300CE06B0038EA1B00002F8BB634 -:1008D0008C5EFF300CE06B0038EA1B00002F8BB6FB -:1008E0008C5EFFEBCD40C01897E0660038EA16003A -:1008F000000C9C2F0CC79CED3B0008582BC0B40C7F -:100900009B2F0B300A970AB6CAED3B00082FFBED70 -:100910006B00086C3B580BC0910C9B0E98305A171B -:100920003910C9201ACFD1C0F80C9A2F0A0E98306E -:100930005B153910C9201BCFD10C9B2F0B760A8D6C -:100940000A17CAACCA301B8D3BE3CD80C00000EB58 -:10095000CD4080201D1A9B300AB68AB69AE0670007 -:10096000EE30381899E06A00F6F7D7C008303CFE40 -:10097000B0B416C031300CC0D8E06C00F4BA8C3280 -:10098000ECBA9C30291A9AF7D7C008303CFEB0B3B5 -:10099000DB2FFDE3CD8080EBCD4080201D1A9B3006 -:1009A0000AB68AB69AE06700EE30281899E06A0025 -:1009B000F6F7D7C008303C00550A001302F1EC5698 -:1009C00004010800008001010900010000FDC801C8 -:1009D0000D02F1EC56030000000100FEB0B3F2C0BE -:1009E00031300CC0C8E06C00F4BA8CBA9C30291AC3 -:1009F0009AF7D7C008303CFEB0B3B82FFDE3CD80E6 -:100A000080D703800070E48000708CEBCD408020A4 -:100A10003D1897300C501C500C502C501C0F8B0F55 -:100A20009CF9EB108B501B401CC2BC500C0FABB19F -:100A30006B0FBCF7EC108B0FCC184BE06C0F04EA7B -:100A40001C00002E0C980CF80C1108F60C0A4B50E8 -:100A50002B402CC34C501C401CB14CAE8C401CA9EC -:100A60004CAE9C401CAEAC400CF80C100A500C4034 -:100A70000CA94CAEBC400CAECC2FDDE3CF9080E097 -:100A8000690F04EA190000F33B0016E04B0055C162 -:100A90000192DB161C92CBB73CAF5CF30B0012ABA0 -:100AA0007BF30A0014180AF60A0C0A140C936C72F1 -:100AB0006CF3BC00045C8C5EFC0000EBCD40C0E03D -:100AC000690F04EA1900007268E0280FA0F008021C -:100AD0004EAD4E92BB9227B137AD5700952800130B -:100AE00002F1EC5604010900008001010A00010036 -:100AF000006803010D02F1EC5603000000010092B2 -:100B00006ABD3AB14A0E0AF3BA0002FE3A8000B753 -:100B10003AAF9AF30700209206927BB73EAB5EFC99 -:100B200006002B9219B338AB581608F007094BF39F -:100B3000BB0002161CE06BC350F607084BB73CFC29 -:100B40001B8000163CC062A17CF80A0D0A149CC0F0 -:100B500058F80A0D0A149CA17CF80A1408B53AE06A -:100B60006B0BDEB73AB14AFE7BE343B93BB14B16A0 -:100B70000AFE3AF131A54A140CE3CD80C00000D43E -:100B800001206D301B300AE0690F04EA1900009261 -:100B900008F00E1510C0505BF85F185008C03830D0 -:100BA0000850089218F00E1510C0505BF85F1850EE -:100BB00018C038300850189228F00E1510C0505B3D -:100BC000F85F185028C0383008502892B8F00E1539 -:100BD00010C060E048FFFF5F185038C03830085040 -:100BE0003892C8F00E1510C060E048FFFF5F185043 -:100BF00048C0383008504892D9F2081510C060003B -:100C00000459001302F1EC5604010A0000800101AE -:100C10000B00010000D7B8010D02F1EC56030000F3 -:100C2000000100E049FFFF5F195059C038300950FA -:100C3000593009C0881A98F00903285808C0212F94 -:100C4000FA2FF95869CF85586AC021300BB88B1636 -:100C50009C2FADD8020000D4011699300B201CC087 -:100C600040201CC060C0A8FEB0FDE8189BC0685CB6 -:100C70005A5F1B129CC27E189B169CD8020000EB88 -:100C8000CD40C0201DE06CC2F8EA1C80011A9B19FF -:100C90008AB68A199AB69AFACBFFFE2FEC198AB651 -:100CA0008A199AB69A3018FAC9FFFE30FA33CB3057 -:100CB0000CFEB0B2AB18975817C7711BACE04C00D4 -:100CC00040C731320CBA8C36FCBA9C30291A9A33A0 -:100CD000CB300CFEB0B26EC031300CC688324CBA8C -:100CE0008CE06C00C0BA9C30291A9A33CB300CFED1 -:100CF000B0B260CF30325CBA8C310CBA9C30291A59 -:100D00009A33CB300CFEB0B255CE8035ACBA8CE005 -:100D10006C00F0BA9C30291A9A33CB300CFEB0B27A -:100D200049CDC000D14B001302F1EC5604010B0079 -:100D3000008001010C00010000C390010D02F1ECE4 -:100D40005603000000010035BCBA8C301CBA9C3040 -:100D5000291A9A33CB300CFEB0B23ECD10323CBAD9 -:100D60008C308CBA9C30291A9A33CB300CFEB0B23E -:100D700033CC60340CBA8C305CBA9C30291A9A336C -:100D8000CB300CFEB0B228CBB0341CBA8C311CBABC -:100D90009C30291A9A33CB300CFEB0B21DCB0034F4 -:100DA0002CBA8C3006BA9630291A9A33CB300CFE06 -:100DB000B0B212CA50320CBA8CBA9630291A9A3391 -:100DC000CB300CFEB0B208C031C9AB30070E9C2F3F -:100DD000FDE3CD80C00000D421202DE06CC268EA84 -:100DE0001C80011A9B198AB68A199AB69A781C50E7 -:100DF0001C301CBA8CE06C0080BA9C30291A9A33E3 -:100E0000CB300CFEB0B1E8C031300CC7183048FA16 -:100E1000C9FFFC350A33CB300CFEB0B209C0901BC1 -:100E2000CCE04C00ACC1001BCCE04C00CAC0C0E020 -:100E30006C0E70EA1C0000300B990B991B3ECA998E -:100E40002A993BC4A81BCC00A1F3001302F1EC5675 -:100E500004010C00008001010D00010000A928011F -:100E60000D02F1EC56030000000100E04C00ACC1A3 -:100E7000B11BDC1897EFD7C007EDBC0007C0225CA0 -:100E8000371BEC1896EDD6C007EDBC0007C0225CFE -:100E9000361BFC1895EBD5C007EDBC0007C0225CE3 -:100EA000353004C2481BCCE04C00CAC2011BDC1820 -:100EB0009BF7DBC007F6071100EDBC0007C0221648 -:100EC000971BEC189BF7DBC007F6061100EDBC0082 -:100ED00007C02216961BFC189BF7DBC007F605110E -:100EE00000EDBC0007C02216953014E06C0E70EACD -:100EF0001C00009907991699259934301CBA8C303A -:100F00000CBA9C30291A9A33CBFEB0B177C90030A5 -:100F10001C2FEDD8220000EBCD4080201DE067C0E3 -:100F200098EA1780011A9C0F8BB88B0F9BB89B32E5 -:100F30000CBA8C36FCBA9C30291A9A33CB300CFE92 -:100F4000B0B15C581CC0702FC70E9CFEB0B104300D -:100F50000CC078C54F2F470E9CFEB0B0FD301C2F43 -:100F6000FDE3CD80800000EBCD4080000F1F00131B -:100F700002F1EC5604010D00008001010E00010099 -:100F8000003CE3010D02F1EC5603000000010020DB -:100F90001DE067C0E8EA1780011A9C0F8BB88B0F21 -:100FA0009BB89B320CBA8C300CBA9C30291A9A33FD -:100FB000CBFEB0B135581CC0702FC70E9CFEB0B030 -:100FC000DD300CC0B8301A300B304CFEB0B3EA2F15 -:100FD000470E9CFEB0B0D2301C2FFDE3CD8080EBDD -:100FE000CD40F8202D189316943057E066C000EAE3 -:100FF000168001AD0ABB1B300CE0650E70EA1500CF -:1010000000EB5C0010EB5C0012EB5C001430181A73 -:1010100099327A33CB300CFEB0B12E581CC1511B23 -:101020008CEDBC0003C112F1D4C0080699E06A003F -:10103000A833CB300CFEB0B11FC1212F060C9CFE93 -:10104000B0B09C300CC3C80E9CFE3700015C7CCD58 -:10105000F12F860C9CFEB0B091300CC3183007E025 -:10106000A0529229AC988C580CC0A1E06C3F20EAA9 -:101070001C0000781C199C581CC02530175C576A4E -:101080003C1837C1C16A0CF80C107DA37C33CB002F -:101090004BD0001302F1EC5604010E000080010158 -:1010A0000F000100008358010D02F1EC560300000F -:1010B000000100F80B0C0AEB5A00106A1CF80C1027 -:1010C0007DA37C33CBF80B0C0AEB5A00126A2CF888 -:1010D0000C107DA37C33CBF80B0C0A2EC5AA0A306A -:1010E0001C2FEDE3CD80F8800070E48001B3F4EBB9 -:1010F000CD4080201DE067C270EA1780011A9C0F66 -:101100008BB88B0F9BB89B357CBA8C314CBA9C301A -:10111000291A9A33CB300CFEB0B094C031300CC1D8 -:1011200068301A301B304CFEB0B34E321CBA8C30D3 -:101130001CBA9C30291A9A33CB300CFEB0B082CE48 -:10114000F02FC70E9CFEB0B02B301C2FFDE3CD80DE -:10115000800000EBCD4080201DE067C278EA178058 -:10116000011A9C0F8BB88B0F9BB89B301A300B3039 -:101170004CFEB0B329321CBA8C300CBA9C30291A00 -:101180009A33CBFEB0B05EC031300CC0682FC70EB2 -:101190009CFEB0B005301C2FFDE3CD80800000EB3D -:1011A000CD40F8202D1893CDCEE067C018EA178007 -:1011B000011A9C002797001302F1EC5604010F005E -:1011C0000080010110000100009330010D02F1ECDC -:1011D000560300000001000F8BB88B0F9BB89BFAE1 -:1011E000CBFFFC0E9C2FEC198AB68A199AB69AFE90 -:1011F000B0AECC1896300CBA1C357CBA8C3005BA1F -:101200009530291A9A33CB300CFEB0B02DC0313056 -:101210000CC448321CBA8C3014BA9430291A9A3350 -:10122000CB300CFEB0B020CF40301A301B304CFE1B -:10123000B0B2DCA6840C9CFEB0B2A4581CC19030A5 -:101240001B0C9CFEB0B18A9A9B2FFBBA1B0C9CFE18 -:10125000B0B420C0602FC70E9CFEB0AFB3C0989A48 -:101260009CE04C0032CE852F470E9CFEB0AFAA30DA -:101270001A300B304CFEB0B2B9300B0C9CFEB0B241 -:1012800085321CBA8CBA9530291A9A33CB300CFEB1 -:10129000B0AFEACBE0C9FE301C2FEDE3CD80F88083 -:1012A000006DB0800075A880007380800078B880E1 -:1012B000006FE880007610800075B08000708CEEC2 -:1012C0001B8000E08F0006F7EC2008E0860068F83D -:1012D0000B010AEE1A800000FD06001302F1EC5625 -:1012E00004011000008001011100010000878D0140 -:1012F0000D02F1EC56030000000100F9BA020014DF -:101300000B141CF5DCC2E8E04A00FFC3F0F3DBC2BB -:10131000E8C420A96BBFBB1429C0B059A9C3B2F659 -:10132000090A48F2091120F609094B5F1B104B18F6 -:1013300098E6188000A96CBFBC161CC140F80B12BF -:1013400000F80B094CF40B010AE08A000EF1EC12D4 -:101350008BF7DAD2E8B96C5C0CF5BC0601F7BB067A -:10136000FF5EFB5EFDF40A1109F4091120C0805EE6 -:101370003DF80A0A4B104BF809094CCEEB187CF5E6 -:10138000BC06015F6C104C5EFCF3DBB2E85BF9F964 -:10139000BC00FF5EFCF80915015E0DA17B5E0C141C -:1013A0007AC080F6091200F609094BF2091108CB40 -:1013B0004BF20B010AF9BC0000A17C5D0A5EFAEE5B -:1013C0001B8000E08F0006F7EC2008FE96FF8CF6ED -:1013D0000C0C4AF60C0D4BF9DAC2E8E04C00FFC3E6 -:1013E00050F3DBC2E8E0800033A96BBFBB1829C013 -:1013F000B05999C2B2F6090A48F20900FA17001367 -:1014000002F1EC56040111000080010112000100FC -:10141000001246010D02F1EC56030000000100111C -:1014200020F609094B5F1B104B1498E6188000A9A1 -:101430006ABFBA160AC1125C0CE04C00FFF9BA028E -:1014400000F1EA129BF7DCD2E8B77A5C0AF5BA063B -:1014500001F7BB06FF5EFBF1EA128BF7DCD2E8B9BD -:101460006A5C0AF5BA0601F7BB06FF5EFB5EFAF49A -:101470000915015E0AA17B5E0A187CC080F609127C -:1014800000F609094BF2091108CC4BF20B000BA135 -:101490007A5D0B5EFB0000F9EB2008F5DCC2E8C3C7 -:1014A000A0E04A00FFC2A0A96CBFBCF3DBC2E8C445 -:1014B00050E04900FFC3F0A96BBFBB1409F60C064E -:1014C0004AE6188000147A5F1AF5EB101C144BF8EA -:1014D0000B1770F7B9070127E9E08A0038E04900E7 -:1014E000FFC4C4F1EB128CF9D9D2E8B96B5C0BF5EF -:1014F000BB0601F7BC06FF5EFCF1DCD01FA17BF947 -:10150000B800FFF3DBB3085BF9F9BB0100F1EB12A4 -:101510001C5EFCA97CC091E6188000F5DBB2E800F7 -:10152000B947001302F1EC560401120000800101DA -:101530001300010000ADFD010D02F1EC56030000A7 -:101540000001005BFAF9B800FF5EF8F80A1200F833 -:101550000A094C5C3ACBDBF1DBD01F5EF8A97BCEED -:10156000E0F6091200F609094B5C39CBABF2091120 -:1015700009F20A1120C0E0F9BB0300F6090A4C1079 -:101580004CF60A094B5C0BF5BB0601F7BC06FF5E87 -:10159000FC167BF5BB06015F6B104B5EFBEA187F08 -:1015A000805EF8F7EC2008F3DCC2E8C610E04900E2 -:1015B000FFC710A96CBFBCF5DBC2E8C740E04A001A -:1015C000FFC7E0A96BBFBB163CF20A014A281AE02C -:1015D0008A007EE04A00FFC6E4F1DAD2E81AD01AA7 -:1015E000D8F6001601E0697999EA19BA821220F654 -:1015F000000648301A5C9A1429F2000648F20015D9 -:1016000002F60006481429F2000648F2001502F618 -:101610000006485C38F4090149F2000648F200155A -:1016200002E1E813E0F60006485C38F4090149F2EB -:10163000000648A369F3E813EAF80A0648F20A1517 -:1016400001E01A00CEC9001302F1EC5604011300A8 -:10165000008001011400010000B9D5010D02F1EC78 -:1016600056030000000100FFC02C0AF60A0648F8E5 -:1016700009011CF7BA0840F4091200F409094A28C4 -:101680000A1B0C1B00E61CFF80A98AF9DAD0175E42 -:10169000FCA97CC070F8091200F809094C5C39C932 -:1016A000EBF60915015E0EF5DBC2E8E04A00FFC16A -:1016B00090E61880005EF8F5DBB2E85BFAF9BC0052 -:1016C000FFF1DCD01F5EF8A97BC070F60A1200F6AD -:1016D0000A094B5C3AC8BBEA187F80E618FF805EB7 -:1016E000F8E6188000F6091509F60817105EF831BB -:1016F000A9A19CA19BE6188000BB88163CC02316BC -:101700001C5CF8A17C2019CFA110995CD95C3C5CD1 -:10171000F9F20B1506A579F6091770F40A1109F408 -:101720000C1120C0F0F9B90300F20A0A4BF1DBD02A -:101730001FF20C09495C09F5B90601F7B806FF5E0E -:10174000F81279F5B906015F69F1D9D01F5EF8F397 -:10175000DBC28BF7D9D2E7E0290381E04900FEC064 -:10176000F2F60C1503F9EA005A45001302F1EC56A3 -:1017700004011400008001011500010000D36D0177 -:101780000D02F1EC5603000000010013DCB79BF9D9 -:10179000DBD2E9A37A5C0AF5BA0601F7BC06FF5E64 -:1017A000FC2FF9E08A000EE049047FC060EA1B7F4D -:1017B00080E61BFF805EFBF5EB10CACFB05EFEF645 -:1017C0000C150BF9EA135CAB7A5F1A144CBFBCE63C -:1017D0001B8000F2091109F20A1120C0F0F9BC03C4 -:1017E00000F8090A481648B7D8F80A094C5C0CF505 -:1017F000BC0601F7B806FF5EF8187CF5BC06015F71 -:101800006C164C5EFC00003FFAB96AF40C011AC079 -:1018100073F40C001AF40B011AE082000F1C9F3FB6 -:10182000FAB96AF40C011AC073F40C001AF40B0133 -:101830001AE08200035EFDF7EC100AA17A5E0DC08B -:1018400033163C1C9F183B1C9F0000F7DCB2E927B5 -:10185000FB5E6DE04B00205E2EF60B111FA96CBFE6 -:10186000BCF80B0A4C5EFCF7DCC2E827FB5E3D5976 -:10187000FBC0E2F60B111FF80A1508BFBAF40B0AF9 -:101880004AF40B1100187CF60A1760000C8F001345 -:1018900002F1EC5604011500008001011600010060 -:1018A0000046A6010D02F1EC560300000001005EA7 -:1018B000FABF5C5CDCEE1C80005EFCE0690000F8B6 -:1018C0000B12005E3DF80B094AF60B111F281BF3A3 -:1018D000EA128CF9DBD2E8B96A5C0AF5BA0601F7BC -:1018E000BC06FF5EFC00001899F80B1100E6198099 -:1018F00000F60C1760CE5BD421189616951494123E -:1019000097E06C0F28EA1C0000405B99BB406BEE2F -:101910001B800099CB407BEE1B800099DB30AA181E -:101920009B2D4BF8FC010CE0A0025AC50C582CC0B2 -:1019300030584CC161E06C10B4EA1C0000783B2FB9 -:10194000FB993B7839314BE80B0C0A1439C0453010 -:101950000B994BC1382F0C780B2FFB990BC0E85813 -:101960008CC030590CC0A1E06C10B4EA1C000078A7 -:101970004B2FFB994B300B993BE06C10B4EA1C00E9 -:10198000007839314BEC0B0C0A1439C035301B99F7 -:101990002B7849314BEA0B0C0A1439C035302B999E -:1019A0002B782B581BC050582BC030300B992B0074 -:1019B000324F001302F1EC560401160000800101C1 -:1019C0001700010000F91D010D02F1EC56030000A3 -:1019D000000100782A149B3009580AC060AE8A9929 -:1019E0003999499929C028AE89169CD8220000D47B -:1019F00031201D3003E0670F28EA1700003001EFA7 -:101A00004100F0EF4100F4E06010B4EA1000006023 -:101A10001C2FFC811CEEF600FC58A6C554EEF40108 -:101A20000C30AA300B089CE0A002061895EF450187 -:101A30000030AA301B089CE0A001FE1894EF44017E -:101A400004EE06002C500C601CF80C1014400BF730 -:101A50004C00985816C3356A0C680BFEB0FCB418DD -:101A6000928FE26A1C681BFEB0FCAE18968FF66A75 -:101A70002C682BFEB0FCA8189BEF4B0040FEB0FD7D -:101A80006718950C9C0C9BFEB0FD621896049C0494 -:101A90009BFEB0FD5D0C9BFEB0FD040A9BFEB0FDFD -:101AA00001400BF74C0070400CF8FB0098400CF81C -:101AB000FC0094181B400CF94B00BCEEFC00FC2F02 -:101AC000FCEF4C00FC601C58ACC044303CEF4C00B8 -:101AD000F8EEFC00CF7D001302F1EC560401170074 -:101AE0000080010118000100006EF6010D02F1EC0A -:101AF0005603000000010000FC58ACE0850102EE36 -:101B0000FC00FC201CEF4C00FC30AA30ABEEFC01CA -:101B10000CE0A00CE9EF4C006830AA30ABEEFC0101 -:101B20000CE0A00CFFEF4C006C30AA30ABEEFC01D7 -:101B30000CE0A00D151894EF4400703006C098EE2C -:101B400006002C79DC069BFEB0FCBE18932FF658DD -:101B500096CF756FACFC1B4120FEB0FD7F1896EF51 -:101B60004600446FBCFC1B4120FEB0FD771895EF8A -:101B7000450048FC1B4120089CFEB0FD6F1894EF07 -:101B800044004C601C58ACC075EF46005CEF45004B -:101B900060EF4400643002C0F830AAE40B11095C25 -:101BA0008BEEFC010CC59DEF4C01086F996F8A6F9D -:101BB0007BCCBC2FF258A2CF156E9CEEFB00F0162A -:101BC0003CC494018C580CC0D1EEFC0098EF4C0042 -:101BD000E4301CA08CEF46005CEF450060EF440051 -:101BE000646EACEEFB00F4163CC114019C580CC0B2 -:101BF000F1EEFC0098EF4C001E24001302F1EC56AD -:101C0000040118000080010119000100002E4D019F -:101C10000D02F1EC5603000000010000E8301CA0AA -:101C20009CEF46005CEF450060EF440064C028A0D4 -:101C300091EEFB00986E0AEEFC00E8162C183AC0F4 -:101C4000A2019C580CC070A0A1A0B1301CEF4C00A8 -:101C5000F8C558EEFC00E4181B163AC0A2018C58D7 -:101C60000CC070A0A1A0B1302CEF4C00F8C47830AB -:101C70003CEF4C00F8C438EF46005CEF450060EFE5 -:101C8000440064A081A09101AC580CC031301CA06C -:101C9000ACFC1B447A069CFEB0FC7E1896301BFE02 -:101CA000B0FDFCC072FC1CC47A069BFEB0FC74182C -:101CB000966E2BFC1C41A0FEB0FC6E0C9BFEB0FD92 -:101CC000F9C0B201BC580CC091EEFC0098EF4C007A -:101CD000EC301CA0BCC028A0B16E1BFE7CFE0C1812 -:101CE0000BEEFA0098EEFC00EC181A143BCC120133 -:101CF000BC580CCBE0304CEF4C00F8300CC118EE67 -:101D00000C002BF6FA009CF74A0098588CC0847798 -:101D1000EAF74A0074F6FA00C4F74A000A5F0013B3 -:101D200002F1EC5604011900008001011A000100C3 -:101D300000BB86010D02F1EC56030000000100001B -:101D4000C02FFC589CCEF5EEFC00F8581CC0805803 -:101D50002CC080583CC080584CC080C098302CC0EB -:101D600088304CC068308CC048310CC028300C2FF3 -:101D7000FDD832800131EC8001322880013264804C -:101D80000111CC800113608001157C80011278EB79 -:101D9000CD40F81895149712966A0CFEB0FB4A18BD -:101DA00094E0630F28EA130000E74400506A1C0E19 -:101DB0009BFEB0FB3F1897E74700546A2C0C9BFE34 -:101DC000B0FB381896E7460058300B089CFEB0FD73 -:101DD00083C052EE148000E7440050300B0E9CFE8E -:101DE000B0FD7AC052EE178000E7470054300B0C6C -:101DF0009CFEB0FD71C052EE168000E746005867A9 -:101E000047663B0E9CFEB0FD67C0D2675C664BFE2A -:101E1000B0FD62C082676C665BFEB0FD5DC03230B3 -:101E200016C0283006666B0E9CFEB0FD55C0D2670A -:101E30005C667BFEB0FD50C082676C668BFEB000B6 -:101E4000E8CC001302F1EC5604011A0000800101F5 -:101E50001B00010000043D010D02F1EC56030000DF -:101E6000000100FD4BC032301CC028300CE6FB00E6 -:101E7000F00C0BE74B00F0E6FB00F4180BE74B000F -:101E8000F4E3CF80F8D703800110F0800115949817 -:101E900089F4091900C0333009B80998892FF9B8B5 -:101EA000099889F4091900C033300AB80A988AF4ED -:101EB0000A100C140C2FCCB709B928170818A85E03 -:101EC000FF00009889122B5C8B580BC024140B5C0C -:101ED0008BF60B100C160C2FCC5EFCEBCD40FCE00F -:101EE000650CA0EA15000030A9EB4900483078EBFA -:101EF00048004CEB4800503058EB480054E06699DD -:101F00009AEA169999E0679999EA173FC9AB17E0E1 -:101F1000663333EA163333E0673333EA173FD3EAE5 -:101F2000E70008E066999AEA169999E0679999EAB4 -:101F3000173FE9EAE70010E0663333EA163333E08F -:101F4000673333EA173FF3EAE70018E0673333EA11 -:101F5000174003EAE70020E0673333EA173FE3EA7C -:101F6000E70028008238001302F1EC5604011B0040 -:101F7000008001011C000100001015010D02F1ECB0 -:101F800056030000000100EB490058E0644788EA6E -:101F9000140000780C3149F8090C08E9480048742D -:101FA0000C582CC031305CC2A8760C590CC230E001 -:101FB0004C0100C080E04C0400C110E04C0800C19E -:101FC00040C078E06C0100EB4C005C300CC178E064 -:101FD0006C0200EB4C005C301CC118E06C0400EBA0 -:101FE0004C005C302CC0B8E06C0800EB4C005C305E -:101FF0003CC058310CEB4C005C304CEA0C0033E038 -:1020000066851FEA1651EBE0679EB8EA174023A7E2 -:10201000080C9A0E9BE0A00D643008FC194014E0F7 -:10202000A00D5FE8EB0034E8EB002CE068147BEADD -:102030001847AEE0697AE1EA193F84E0A00D51E863 -:10204000EB003C300A300BA91BE8EB0008E8EB0082 -:1020500010E8EB0018A70A0C980E99E0A00D4114A7 -:10206000921693FC173FE06B2CE0A00E2830080E70 -:1020700099E0A00D3604980699E0A00D32A91B6BDB -:102080003CE0A00E1C30080028F9001302F1EC56C9 -:1020900004011C00008001011D000100007AAD0157 -:1020A0000D02F1EC560300000001000E99E0A00DB6 -:1020B0002A04980699E0A00D26E8EB00086B4CE096 -:1020C000A00E0F30080E99E0A00D1D04980699E0AF -:1020D000A00D19E8EB00106B5CE0A00E0230080EBA -:1020E00099E0A00D1004980699E0A00D0CE8EB0013 -:1020F00018300CE94C0044301CEB4C0060EB4C00F9 -:1021000064089C2B0CE94C004CE3CF80FC0000E001 -:102110006C0CA0EA1C0000301BF94B0060F94B006E -:10212000645EFDD43120AD189730043005FACCFF41 -:10213000F0300A300BB91BF8EB0008F8EB00103058 -:102140000CFB6C0008E0614788EA110000413C8309 -:102150008C414CEE1C8000839C415CEE1C80008313 -:10216000AC31EA029B2E0B633CE0A009F16E0C58E7 -:102170002CC041302C503CC038303C503C633CE0DB -:10218000660CA0EA1600006D8B580BC0E0580CC01E -:1021900080988C6D6B163CC045300CED4C0060FB9C -:1021A0003C00082F6DD8326D9B580B00FB2E00139E -:1021B00002F1EC5604011D00008001011E00010027 -:1021C00000EF66010D02F1EC560300000001003142 -:1021D000EAC3B06D6B5C8BE0A009F218936D670EDB -:1021E0009CFEB0FC13189B069CFEB0FAA3E0A00D69 -:1021F00025ECEB003031EAF7D7B010633CE0A009E2 -:10220000FD18936D670E9CFEB0FC00189B069CFEAB -:10221000B0FA90E0A00D12ECEB003831EAF7D7B03D -:1022200010633CE0A00A0818976D6CFEB0FBEE1836 -:102230009B0E9CFEB0FA7EE0A00D00ECEB0040305F -:102240000CED4C0064C3D8300BE0A009AD189331FD -:10225000EA6D6B5C8B633CE0A009A618976D6CFE81 -:10226000B0FBD41892660C6E0BFEB0F92B049BFEEB -:10227000B0FA60E0A00CE2ECE80030E0A00B40EC2B -:10228000EB0030661C6E1BFEB0F91C049BFEB0FA1E -:1022900051E0A00CD3ECE80038E0A00B31ECEB00EF -:1022A00038662C6E2BFEB0F90D049BFEB0FA42E0AE -:1022B000A00CC4ECE80040E0A00B22ECEB0040FADC -:1022C000CCFFF0300A300BB91BF8EB0008F8EB003C -:1022D000D616001302F1EC5604011E000080010125 -:1022E0001F0001000050DD010D02F1EC560300005B -:1022F00000010000103000C57831EAF7D0B010635B -:102300003CE0A009631897ECE200306E0CE0A00CF2 -:10231000A704980699E0A00AD1BB1B6E0CE0A00CA4 -:102320009F04980699E0A00AC9BB08E0A00C0FFA28 -:10233000E80010E0A00AF6FAEB0010ECE200386EBC -:102340001CE0A00C8D04980699E0A00AB7BB1B6E98 -:102350001CE0A00C8504980699E0A00AAFBB08E039 -:10236000A00BF5FAE80018E0A00ADCFAEB0018EC84 -:10237000E200406E2CE0A00C7304980699E0A00ADD -:102380009DBB1B6E2CE0A00C6B04980699E0A00A84 -:1023900095BB08E0A00BDBFAE80020E0A00AC2FA37 -:1023A000EB00202FF06D6C1830CA85E0A00CBD1436 -:1023B000961697FAEA00100C980E99E0A00C04FA11 -:1023C000EB0010FAEA00180C980E99E0A00BFCFA4A -:1023D000EB0018FAEA00200C980E99E0A00BF4FA32 -:1023E000EB00203007C0F8FACCFFF0F80702320803 -:1023F0009A0A9B003550001302F1EC5604011F00AD -:10240000008001012000010000CFB6010D02F1ECB7 -:102410005603000000010004980699E0A00C52C089 -:1024200032049406952FF7403C1837CF05631763A5 -:1024300026E2EA002C08980A99E0A00C41C0E30EBD -:1024400036C044301CFB6C0008300CE34C0044E206 -:10245000EA00342D41A31BCDAA0E36C084302CFBDC -:102460006C0008E2EA003CE2EB002C2BC1620C2F6E -:10247000FC830CCCCAD703800131A0800131EC80F1 -:102480000132288001326480011638800110F0800A -:10249000011360800131D480013868800134C48028 -:1024A0000137568001352C80013932800137D080C8 -:1024B0000138A8800138A4D5313005E0674558EAD5 -:1024C0001700003003EF4300F0EF4300F4EEFC018F -:1024D000002FFCEF4C0100401C581CC051EF430082 -:1024E000ECEF4300E8EEFC00FC58ACC52431EA30C8 -:1024F0000BEEFC0104E0A0087BEF4C010831EA3050 -:102500001BEEFC0104E0A008731894EF44010CEEEC -:10251000FC00FCEE0C002000279B001302F1EC569F -:102520000401200000800101210001000073070167 -:102530000D02F1EC56030000000100EEFB0100F675 -:102540000B1014E14B008C581CC305EEF20108641B -:102550000C680BFEB0F7EC18918FB1641C681BFE81 -:10256000B0F7E618968FC6642C682BFEB0F7E0181B -:102570009B8FDBFEB0F8A018940C9C0C9BFEB0F86F -:102580009B1896029C029BFEB0F8960C9BFEB0F83E -:102590003D089BFEB0F83AE14C0064E0FB008CE0A3 -:1025A000FC0088181BE14B00B0EEFC00FC2FFCEF98 -:1025B0004C00FCEEFB010058ABC044303CEF4C003B -:1025C000F8EEFC00FC58ACE0850157EEFC00FC2066 -:1025D0001CEF4C00FCEEFC010458AB31EA30ABC2FE -:1025E00011E0A00823EF4C005C31EA30ABEEFC01B7 -:1025F00004E0A00839EF4C006031EA30ABEEFC019A -:1026000004E0A0084FEF4C006430065896C3C4EEB7 -:1026100006002C79AC0A9BFEB0F7F818952FF6CF80 -:102620006BE0A007F71896EF460110EEF501086F72 -:102630007C6C0BFEB0F77C6A0BFEB000768D00134D -:1026400002F1EC560401210000800101220001008A -:1026500000E6CC010D02F1EC56030000000100F78A -:10266000E7EF4C005C6F8C6C1BFEB0F7736A1BFECF -:10267000B0F7DEEF4C00606F9C6C2BFEB0F76A6A1F -:102680002BFEB0F7D5EF4C0064EEFC00FCEE0C0026 -:10269000266D9B6D8CFEB0F7CB6D7BFEB0F7C8FC52 -:1026A0001B4040FEB0F81A18956F7CFC1B4120FEC1 -:1026B000B0F88818968FE66F8CFC1B4120FEB0F8AE -:1026C0008118948FF46F9CFC1B4120FEB0F87AEFC8 -:1026D0004C0040EEFB010058ABC071EF460050EFDC -:1026E000440054EF4C00583006C10831EAEC0B119D -:1026F000095C8BEEFC0104E0A0079EEF4C01146F17 -:10270000696F5A6F4BC21D2FF658A6CF05E064467D -:1027100074EA1400006E9CEEFB00F0163CC5A46841 -:102720000C580CC101EEFC008CEF4C00D8301C8919 -:102730000C6EECEF4C00506EFCEF4C00546F0CEF45 -:102740004C00586EACEEFB00F4163CC144681C58BB -:102750000CC121EEFC008CEF4C00DC301C891C000D -:1027600056BD001302F1EC56040122000080010165 -:1027700023000100005977010D02F1EC560300001F -:102780000001006EECEF4C00506EFCEF4C00546FFB -:102790000CEF4C0058C0288913EEF6008CEEFC00BC -:1027A000D80C2CEF4C00E86E0BEEFA00DC0C2A146F -:1027B0003BC0C2681A581AC09189238933EF43007D -:1027C000EC301CEF4C00F8C678183BC0C2680C58BF -:1027D0001CC09189238933EF4300EC302CEF4C006F -:1027E000F8C5A8EEFC00E01816EF4600EC303CEF10 -:1027F0004C00F8C5186EECEF4C00506EFCEF4C002E -:10280000546F0CEF4C005889038913EF4300E8EE36 -:10281000F6008C682C580CC051EF4600E0301C8943 -:102820002CEEFC00E00C2CEF4C00ECFC1B447A0A74 -:102830009CFEB0F7651892301BFEB0F8E3C072FC46 -:102840001CC47A0A9BFEB0F75B18926E2BFC1C41ED -:10285000A0FEB0F755049BFEB0F8E0C092683C586B -:102860000CC071EF4600E4301C893CC02889336EEF -:102870001BFE7CFE0C180BEEFC00E418160C3BC093 -:1028800082683C00F454001302F1EC56040123006A -:102890000080010124000100004D5F010D02F1ECF8 -:1028A00056030000000100581CC051304CEF4C0092 -:1028B000F8C048303CEF4C00F8300CC118EE0C006A -:1028C0002BF6FA0090F74A008C588CC08477BAF740 -:1028D0004A0068F6FA00B8F74A00B42FFC589CCEBC -:1028E000F5EEFC00F8581CC080582CC180583CC242 -:1028F00030584CC2E0D93AEEFC0118301B99BBEEBF -:10290000FB00E899CB302B99DB401C580CC2D1302E -:102910002BEEFC0118E0A030D7D93AEEFC011830BC -:102920001B99BBEEFB00E899CB304B99DB401C5860 -:102930000CC1B1CEEBEEFC0118301B99BBEEFB00D5 -:10294000EC99CB308B99DB401C580CC0E1CE1BEED0 -:10295000FC0118301B99BBEEFB00EC99CB310B99B5 -:10296000DB401C580CCD50D93AD703800131EC80A4 -:1029700001322880013264800111CC800113608013 -:102980000131D48001157C800112788001861CEB16 -:10299000CD40F81895149712966A0CFEB0F5FE1803 -:1029A00094E0634558EA13001BA7001302F1EC56AC -:1029B0000401240000800101250001000027E70137 -:1029C0000D02F1EC560300000001000000E7440096 -:1029D000446A1C0E9BFEB0F5F31897E74700486A5F -:1029E0002C0C9BFEB0F5EC1896E746004C300B081B -:1029F0009CFEB0F837C052EE148000E7440044302B -:102A00000B0E9CFEB0F82EC052EE178000E7470078 -:102A100048300B0C9CFEB0F825C052EE168000E743 -:102A200046004C6717663B0E9CFEB0F81BC0D26791 -:102A30002C664BFEB0F816C082673C665BFEB0F8B1 -:102A400011C0323016C0283006666B0E9CFEB0F8FE -:102A500009C0D2672C667BFEB0F804C082673C6672 -:102A60008BFEB0F7FFC032301CC028300CE6FB00F4 -:102A7000F00C0BE74B00F0E6FB00F4180BE74B0003 -:102A8000F4E3CF80F8D703800110F080011594EBB8 -:102A9000CD40F8205D1693300B504B503B502B50DF -:102AA0001BE0674158EA1700005813C0918F0B785C -:102AB0000B8F1B781B8F3B782C8F2CC7A8E06641AF -:102AC00074EA1600006C1C6C09129A009D10001329 -:102AD00002F1EC56040125000080010126000100EE -:102AE00000B22C010D02F1EC5603000000010020A1 -:102AF0001A6E0B143BC1A431EA2FFB5C8BE0A005DE -:102B0000EF8F4C31EA6E0B2FFB5C8B6C1CE0A00648 -:102B1000058F6C31EA6E0B2FFB5C8B6C1CE0A00602 -:102B20001B8F5C6E062FF6C3E831EAC161F7D9B09E -:102B300010E0A005D58F4C31EA6C0B5C8B6C1CE06F -:102B4000A005EC8F6C31EA6C0B5C8B6C1CE0A00672 -:102B5000038F5C6C06C278F7D9B010E0A005B48D85 -:102B60002C31EA300B6C1CE0A005AE18958D356C4D -:102B7000246E4C680BFEB0F5356A0BFEB0F5A08FE5 -:102B80004C6E6C681BFEB0F52D6A1BFEB0F5988F7D -:102B90006C6E5C682BFEB0F5256A2BFEB0F5908F4D -:102BA0005C6C060C9CFEB0F7C1189B6E4CFEB0F638 -:102BB000518F1C0C9CFEB0F7B9189B6E6CFEB0F6E2 -:102BC000498F3C0C9CFEB0F7B1189B6E5CFEB0F6D2 -:102BD000418F2C6E286E396E1AFACBFFF8FACCFFB3 -:102BE000F0C37C300C500C6E286E396E1AFACB0094 -:102BF000EC3C001302F1EC560401260000800101B8 -:102C000027000100000D97010D02F1EC56030000B2 -:102C1000000100FFFCFACCFFF4CCFC6E0C2FFC8F03 -:102C20000C300C8F1C8F3C8F2CE0A02F71404B99E7 -:102C30006B402B997B403B998B401B999B5823C041 -:102C400040301BE0A02F762FBDE3CF90F8D7038054 -:102C50000131EC8001322880013264800131D4805E -:102C60000110F08001163880011360800185F88022 -:102C700001861CEBCD40FE1893169114961292100B -:102C800097300B0E9CFEB0F711C4120E9BEE1B800A -:102C9000000C9CE0A0063CE064C1E6EA141A63E084 -:102CA00065A5DCEA15404CE0A0086A08980A99E09E -:102CB000A007DDFEB0F6A4C3CDFEB0F71B870C0E57 -:102CC0009C0E9BFEB0F56418970C9C0C9BFEB0F517 -:102CD0005F0E9BFEB0F506E0A00852E0A03752FE62 -:102CE000B0F68E189BEE128000049CE0A00610E067 -:102CF000A0084608980A99E0A007B9FEB0F680C17E -:102D00008DFEB0F6F7830CE3CF80FE301B0E9CFEE9 -:102D1000B0F6C0007D49001302F1EC560401270013 -:102D20000080010128000100009A7C010D02F1ECF5 -:102D300056030000000100C4F30E9B0C9CEE1C80A7 -:102D400000E0A005F7E064C1E6EA141A63E065A5B7 -:102D5000DCEA15404CE0A0082508980A99E0A00795 -:102D6000983008E0698000EA194066E0A0067CFE21 -:102D7000B0F658CF0CFEB0F6CF870C0E9C0E9BFE23 -:102D8000B0F51818970C9C0C9BFEB0F5130E9BFE2B -:102D9000B0F4BAE0A00806E0A03706FEB0F642188C -:102DA0009BEE128000049CE0A005C4E0A007FA0896 -:102DB000980A99E0A0076D3008E0698000EA19C020 -:102DC00066E0A00651FEB0F62DCC5CEE1C8000FE45 -:102DD000B0F6A2830CE3CF80FE0000EBCD40F818E4 -:102DE000951693149612971094300B0E9CFEB0F625 -:102DF0006FC1C20E9BEE1B80000C9CE0A0059AE008 -:102E0000A007D0E068C1E6EA181A63E069A5DCEA29 -:102E100019404CE0A0073DFEB0F604C9CCEE1C8082 -:102E200000FEB0F6798B0CC278300B0E9CFEB0F62B -:102E300043C2230E9B0C9C00A265001302F1EC56CA -:102E400004012800008001012900010000DAC70107 -:102E50000D02F1EC56030000000100EE1C8000E0C2 -:102E6000A0057AE0A007B0E068C1E6EA181A63E0BE -:102E700069A5DCEA19404CE0A0071D3008E0698034 -:102E800000EA19C066E0A00601FEB0F5DDC75CEE01 -:102E90001C8000FEB0F6528B0C300B089CFEB0F686 -:102EA00029C2B20E9C0E9BFEB0F49618970C9C0C97 -:102EB0009BFEB0F4910E9BFEB0F438E0A00784E0D6 -:102EC000A03684FEB0F5C0189B089CE0A00544E045 -:102ED000A0077AE068C1E6EA181A63E069A5DCEAAF -:102EE00019404CE0A006E7FEB0F5AEC46CFEB0F6AB -:102EF00025870CE3CF80F8301B089CFEB0F5EEC2AE -:102F0000930E9C0E9BFEB0F46718970C9C0C9BFED6 -:102F1000B0F4620E9BFEB0F409E0A00755E0A036C5 -:102F200055FEB0F591189B089CE0A00515E0A007A0 -:102F30004BE068C1E6EA181A63E069A5DCEA1940CB -:102F40004CE0A006B8FEB0F57FC17CFEB0F5F68778 -:102F50000CE3CF80F8D7038001352C00C3D20013D7 -:102F600002F1EC5604012900008001012A00010051 -:102F7000004F0C010D02F1EC56030000000100802F -:102F80000112788001966C800133F88001386880E6 -:102F9000013756800114E8800115DCEBCD40E018C4 -:102FA00097E065FFFFEA15C406FC16C4340C9BFECF -:102FB000B0F5A6C0D30E9C0A9BFEB0F5ADC082FC56 -:102FC0001C44340E9BFEB0F3C31897C3C80E9C0A72 -:102FD0009BFEB0F595C103E06BFFFFEA1BC3330E08 -:102FE0009CFEB0F599C082FC1C43B40E9BFEB0F36E -:102FF000AF1897C2883015EA154407301BEA1B4307 -:10300000340E9CFEB0F57CC0D30E9C0A9BFEB0F53E -:1030100083C082FC1CC3B40E9BFEB0F3991897C109 -:10302000280E9C0A9BFEB0F56BC0D3301BEA1B44F4 -:10303000340E9CFEB0F570C0620E9C0C9BFEB0F38B -:103040008718970E9CE3CD80E0D7038001157C8024 -:10305000011594800111CCB18CF9DCC001EC1C008D -:10306000015EFC3009F40B0D0AA19AC0382FF9A1BA -:103070009AE04A0100C0435C595889CF955C5900D9 -:103080007228001302F1EC5604012A0000800101AD -:103090002B00010000F0B7010D02F1EC5603000017 -:1030A0000001005889C0353F8C5EFCF40B1601F41A -:1030B0000B0108F7E8108BF7E911C9F3EA11099938 -:1030C000195EFDEBCD40E018971696E1BC0000CDEF -:1030D0006F300BE06A4964EA1A0000951B580CC077 -:1030E00020D3033FF58F95301B8F0BE06B00808F53 -:1030F0000BC020D5038FB5303AE06B0280E06C4105 -:1031000064EA1C8000E0A03D4FED3C000C580CC070 -:1031100040310C8F0C8F256C0A6C1B0E9CCB5F5BB7 -:103120008CC0413F8CE3CD80E0E3CF80E0D70380CB -:1031300001A600EBCD40801897E1BC0000C9FFC09C -:1031400020D3033FFC8F9C8FBCE3CF80800000D452 -:1031500021201D18961697300C500C34BCE0A03579 -:103160001730258D05E0644964EA1400008906687B -:103170000CCE1FE06A4974EA1A00006E3C952C6E72 -:103180004C954C3009B4898919680C301BEF380014 -:10319000085808C240990BE069008099099905EF29 -:1031A00039000800B248001302F1EC5604012B006C -:1031B000008001012C00010000E49F010D02F1ECF0 -:1031C000560300000001005C390E092F899519EFA4 -:1031D0003900089539E06A0703892A6E0AA17AEF57 -:1031E000390008F5E9110AE81AA000993A6E0AA117 -:1031F0007A6E49F5E9110AE81AE001994AC0D895B2 -:1032000039E06A0701892A6E0AA17A6E49F5E91147 -:103210000AE81AE001993A682A998A8D0BD5036861 -:103220001C580CC0F1E0A001B9C0C1FECFFFFC40AA -:103230000B2FFB500B400CEE5C4240CF233FDCC019 -:10324000E88D05681C5BCCC040681C5BECC0313F5E -:10325000FCC05834BCE0A034CF300C2FFDD822D4B1 -:1032600031201D18951690149712961094300C501A -:103270000C34BCE0A0349E30138B03E06C00808BD8 -:103280000C30228B02E0614964EA11000083056280 -:103290000CC63FE06C4974EA1C0000992099473045 -:1032A0000BB88B831BA176EDE71107620C5C54C051 -:1032B00080E816A8009936E817F8019947C048E851 -:1032C00017E0019937E06B000EC4001302F1EC56D1 -:1032D00004012C00008001012D000100008E270157 -:1032E0000D02F1EC560300000001000701832B6280 -:1032F0002B998B9903D503621C580CC0E1C5FDC006 -:10330000C1FECFFFFC400B2FFB500B400CEE5C428C -:1033100040CF333FDCC0E88B02621C5BCCC0406214 -:103320001C5BECC0313FFCC05834BCE0A0347630AC -:103330000C2FFDD8320000EBCD40F8201D1896165A -:1033400097300C500C34BCE0A0344630158D05E0AD -:103350006C00808D0C30248D04E0634964EA130016 -:10336000008706660CC0BF300C871CE06B07028725 -:103370002BE06B4974EA1B0000B68CEF3C00085848 -:103380000CC0D0EF3C00085C3C0E0C2F8C971CEF5F -:103390003C0008973CB6858737C0586E3C971C6E3A -:1033A0004C973C6E0BA17B6E4A2F870F8C180AF747 -:1033B000EA110BE81BE0008D3B660C662B998B999C -:1033C00005D503661C580CC0E1CF9CC0C1FECFFFE1 -:1033D000FC400B2FFB500B400CEE5C4240CF333FC8 -:1033E000DCC0E88D04661C5BCCC0400081F8001393 -:1033F00002F1EC5604012D00008001012E000100B5 -:10340000001BEC010D02F1EC560300000001006608 -:103410001C5BECC0313FFCC05834BCE0A034103021 -:103420000C2FFDE3CD80F8EBCD40F81895169714DE -:1034300096129434BCE0A033E1301C8B0CE06C009D -:10344000808B0C302C8B0CE0634964EA13000087FE -:1034500005660CCA6EE06B4974EA1B0000300CB6BE -:103460008C871CE80C1518C1C0EF3C000C580CC12F -:10347000806E0CA17CE81CA8008B3C6E0CA17C6EBD -:103480002AF9EA110CE81CB8018B4CC038FECFFFBA -:10349000FC6A7CEDBC0003CFB2308C8BBCC0E86E04 -:1034A0000AA17A6E2CF5EC110AF5E410BAEF3C0093 -:1034B0000C184AE81AA0008B3A6C0A6C295C540874 -:1034C0009CC040ED38000CC0283008A17AF5E91105 -:1034D0000AF5EC10BAF5E810CAED3C000C184AE801 -:1034E0001AE0008B4AEF3C000C580C6E1CC1709720 -:1034F0002CC088EDBC0000C0526A5C762A14CC97C0 -:103500002A6A7CEDBC00036A7CCF52EDBC0000004F -:103510003B56001302F1EC5604012E00008001011D -:103520002F00010000A457010D02F1EC560300002A -:10353000000100C1C26A5C762A14CC972AC1789730 -:103540001C6E2C973CC0F8763C580CC0C06A7CEDD1 -:10355000BC0001C082761A153C971A8B6C763C2011 -:103560001C973C6A7CEDBC0003CEF2308C8BBCED2A -:103570003C000C580C6C1CC0F0972C6A7CEDBC0015 -:1035800004C2036A7CEDBC0000CF926A5C762A1408 -:10359000CC972ACF4B971C6C2C973CC0F8763C58A4 -:1035A0000CC0C06A7CEDBC0001C082761A153C9745 -:1035B0001A8B6C763C201C973C6A7CEDBC0004CED8 -:1035C000F26A7CEDBC000AC072E06C04008BBC3F68 -:1035D000FCE3CD80F86A7CE21C0300C0B06A3CECDE -:1035E0001C80008B3CE06C03008BBC3FFCE3CD8077 -:1035F000F834BCE0A03336E3CF80F8800195E88052 -:1036000001962CE06C4964EA1C0000780C787CE29E -:103610001C00305F1C5EFCEBCD40FC18971694E05C -:103620006C4378EA1C00007806E065436CEA1500FC -:10363000006C3C00BDD1001302F1EC5604012F00D8 -:10364000008001013000010000B43F010D02F1ECE7 -:1036500056030000000100FEB0F30618926C0CFE49 -:10366000B0F30218938E8CEE0C001C982CFEB0F375 -:1036700011069BFEB0F06A6A0BFEB0F067049BFE79 -:10368000B0F19CE06BF5C3EA1B411CFEB0F122894E -:103690000C6C4CFEB0F2E818938E8CEE0C001C986B -:1036A0003CFEB0F2F718926C1CFEB0F2DD049BFEFB -:1036B000B0F04C6A1BFEB0F0B7069BFEB0F17EE0A6 -:1036C0006BF5C3EA1B411CFEB0F104891C6C5CFE67 -:1036D000B0F2CA18938E8CEE0C001C984CFEB0F21F -:1036E000D918926C2CFEB0F2BF049BFEB0F02E6A8B -:1036F0002BFEB0F099069BFEB0F160E06BF5C3EADB -:103700001B411CFEB0F0E6892C089B0E9CC03CE3DC -:10371000CF90FCEBCD40FC18971694E06C4378EA10 -:103720001C00007806E065436CEA1500006C3CFE66 -:10373000B0F29A18926C0CFEB0F29618938E8CEE42 -:103740000C001C982CFEB0F2A5069BFEB0EFFE6AA2 -:103750000BFEB0EFFB049B00279A001302F1EC561E -:1037600004013000008001013100010000A082014D -:103770000D02F1EC56030000000100FEB0F130E054 -:103780006BF5C3EA1B411CFEB0F0B6890C6C4CFE15 -:10379000B0F27C18938E8CEE0C001C983CFEB0F2BC -:1037A0008B18926C1CFEB0F271049BFEB0EFE06AC5 -:1037B0001BFEB0F04B069BFEB0F112E06BF5C3EAC6 -:1037C0001B411CFEB0F098891C6C5CFEB0F25E18C8 -:1037D000938E8CEE0C00178E4CFEB0F26D18976C29 -:1037E0002CFEB0F2530E9BFEB0EFC26A2BFEB0F07F -:1037F0002D069BFEB0F0F4E06BF5C3EA1B411CFE06 -:10380000B0F07A892CE3CF90FCD703800116388082 -:1038100001160C800110F0800112789889F40919C2 -:1038200000C0333009B80998892FF9B8099889F48C -:10383000091900C033300AB80A988AF40A100C1427 -:103840000C2FCCB709B928170818A85EFF000098FC -:1038500089122B5C8B580BC024140B5C8BF60B105D -:103860000C160C2FCC5EFCEBCD40F8189516971477 -:1038700096300C30048A83C1185C83009FF80013D3 -:1038800002F1EC5604013100008001013200010018 -:10389000003549010D02F1EC56030000000100580B -:1038A00003C085E60B100C0A0B761BFEB0EFE02080 -:1038B000135C835803C0340C9320132FF4EE0419C7 -:1038C00000CEE5E3CD80F8EBCD40F81895169714BF -:1038D00096300C30048A83C1185C835803C085E697 -:1038E0000B100C0A0B762BFEB0EFC220135C835832 -:1038F00003C0340C9320132FF4EE041900CEE5E33B -:10390000CD80F8EBCD40F8189516971496300C3012 -:10391000048A83C1185C835803C085E60B100C0A27 -:103920000B763BFEB0EFA420135C835803C0340C2D -:103930009320132FF4EE041900CEE5E3CD80F88038 -:103940000111CCD4311893FC173FE0E0654000EA48 -:1039500015407FE0620114EA120000300BFEB0F166 -:103960005FC4A3FC113F50301BEA1B3F80069CFE46 -:10397000B0F162C192069CE0A002C830080A99E04A -:10398000A0023B30080E99E0A00122E0A00309E468 -:103990000C032CE0A0031F30080299E0A0022D00C8 -:1039A000288A001302F1EC56040132000080010164 -:1039B00033000100008AF2010D02F1EC5603000011 -:1039C000000100FEB0F0F4D832FC1C3F80069BFEE4 -:1039D000B0F02AE0A002AC30080A99E0A0021F3043 -:1039E000080E99E0A00106E0A002EDE40C032CE033 -:1039F000A0030330080299E0A0021114981699E080 -:103A00006A2D18EA1A5444E06B21FBEA1B3FF9E0E7 -:103A1000A000BCFEB0F0CCD832FC1BBF80069CFEE0 -:103A2000B0F110C1C3EE138000069CE0A00280300C -:103A3000080A99E0A001F330080E99E0A000DAE04E -:103A4000A002C1E40C032CE0A002D73008FC19BF8F -:103A500050E0A001E4FEB0F0ABD832FC1CBF800601 -:103A60009BFEB0EFE1E0A0026330080A99E0A001FC -:103A7000D630080E99E0A000BDE0A002A4E40C033B -:103A80002CE0A002BA3008FC193F50E0A001C7E0CA -:103A9000682D18EA185444E06921FBEA19BFF9E0DF -:103AA000A000A8FEB0F084D832D703800134C480CF -:103AB0000138FE8001393280013756EBCD40C01805 -:103AC00097169600E3CF001302F1EC560401330081 -:103AD0000080010134000100009EDA010D02F1ECCA -:103AE00056030000000100301B0C9CFEB0F0BCC06F -:103AF000830E9C0C9BFEB0EFA9C49FE3CD80C03029 -:103B00000B0C9CFEB0F0BCC2E20E9C0C9BFEB0EF16 -:103B10009D1896300B0E9CFEB0F0A60C9CC123C3E2 -:103B20006FE0A00217E0682D18EA185444E06921FC -:103B3000FBEA194009E0A0006FFEB0F04BE3CD8036 -:103B4000C0C25FE0A00206E0682D18EA185444E005 -:103B50006921FBEA19C009E0A0005EFEB0F03AE37B -:103B6000CD80C0301B0E9CFEB0F07EC073E06C0FA9 -:103B7000DBEA1C3FC9E3CD80C0300B0E9CFEB0F0E9 -:103B80007FC072E06C0FDBEA1CBFC9E3CD80C0E3ED -:103B9000CF80C080011360800138688001352C809F -:103BA0000114E88001157C80011594D021F7E920EB -:103BB00004C047EE198000C358A17BF7EA1004C087 -:103BC00041EE198000C7F85CFCA179F1E91004E02E -:103BD0008000E2103AF20B1300C0825CDC169714EE -:103BE00096129B109A0E99000660001302F1EC5693 -:103BF00004013400008001013500010000F462017D -:103C00000D02F1EC560300000001000C984ED50A9D -:103C10003BC0C2D401C43CD402101AF609014BF7D0 -:103C2000EA1004C721D0225EFB5C2AE08100B30ABF -:103C300039E08300C3CAE8D021F7E92004C047EE89 -:103C4000198000CCDBA17BF7EA1004C4E05CFCA186 -:103C500079F1E91004E08000B1123BC072169714AC -:103C600096129B109A0E990C984D650A3BC0E2D4AF -:103C700001C15CD402100AF609004BC4625D0B5D01 -:103C80000AC022A1AA2FF7C4085C2AE08100830A97 -:103C900039E0830093129B109AC8F8D401CC7CCDF4 -:103CA0004CD4020E265E0CE046003FC1B2EC05117A -:103CB00020E0460020C0B2F0050944F2050945F0B5 -:103CC000060A48F2060A490A48C088F20509441063 -:103CD0004412983009F0060A485804C020A1A85E92 -:103CE000FCD402D743C5E85CFCA179F3E81004C01A -:103CF000605D09129B109AD0225EFB5D09A19C5D5C -:103D00000B126BD0225EFBD401C5DC0086A500132C -:103D100002F1EC560401350000800101360001007B -:103D20000061A9010D02F1EC56030000000100D46E -:103D3000025807E08A0016E9DAC00BE0240400C04C -:103D4000C3C041EDBA000BC082E0640800080A5C01 -:103D50000BC032BFBB2FF7E04707FFC324C3485C4B -:103D6000372FF7E0470036C2922F67EE051120E0AB -:103D7000470020C0B2F4050946F6050945F4070AD4 -:103D80004AF6070A4B0A4AC088F605094614461641 -:103D90009A300BF4070A4AEDBA0000C0920C76C0C4 -:103DA00041EDBA0001C04230160C0A5C0B5D0B5DA0 -:103DB0000AA17BC1483FFBC128300B300AC0F8483C -:103DC0009B300AC0C8EDBB001FF7B70101AB9AF5E5 -:103DD000EB115AA17BAB9BF7E7115BA19C5D0BD06C -:103DE000225EFBFFE00000F60412005E0CE04400DF -:103DF00020C0C0E8051120F604094BF4050A450A65 -:103E00004BF404094A08175EFCF40412002E041453 -:103E10009BF604094B300A08175EFCF20412005EA0 -:103E20000CE0440020C0C0E8051120F2040949005C -:103E3000D301001302F1EC560401360000800101A9 -:103E40003700010000DE12010D02F1EC5603000004 -:103E5000000100F0050A450A49F004094808165E09 -:103E6000FCF00412002E041099F2040949300808ED -:103E7000165EFCF6071615AB6BF7EA135BAB7A5CC4 -:103E800037EFBB001FF7B700015C375EFC0000F2A4 -:103E9000061615AB69F3E81359AB785C36EFB90039 -:103EA0001FF7B600015C365EFCD021A17B5CFCA153 -:103EB000795C0C103AF20B1300C07216971496122C -:103EC0009B109A0E990C984BC50A3BC242F3E8101E -:103ED00005C860D411CCFFC9AFCDBFCB2F0C07E014 -:103EE0002703FEF4080640F6080642F4090644F6E5 -:103EF00009064A0202F403004A5C0B0404F40500BC -:103F00004A5C0B004408743006F7B601FF0C4AD433 -:103F100012C1FB5C2AFE91FF62F3E81005FE91FFDF -:103F200071C5CBD021A17B5CFCA1795C0C4A350A20 -:103F30003BC3320A39C382F3E81005C390F7EA1095 -:103F400005FE90FF5FD401C96FC61FCA2FC79FD45B -:103F5000020C1700AF9F001302F1EC56040137006A -:103F600000800101380001000049F9010D02F1EC67 -:103F700056030000000100FE37FC013376A19B5D73 -:103F80000AA1995D08103AF20B1300C043101AF60B -:103F900009014B5CF45CF5EC140001A17A5CFB2098 -:103FA00016CF21F7EA100B5C3B5CF45CF5089A0A2B -:103FB0009BA96BF7EA138BA96ACDDA5C2AFE91FF05 -:103FC000200A39FE93FF30C1BB5C28FE90FF1BC165 -:103FD0007BF7EA1005FE90FF14C17BFFE00000D0E4 -:103FE00021F80B15015CFC167BFE90FF0CEFDBC388 -:103FF00008E04700FFC0F0A77B300A5C37EFBB004A -:104000001FF7B700015C37FE37FC80D401C11FD415 -:1040100002CFEAA96BFE90FEF9CF2AD233C028D492 -:1040200033F5EB101CF9E9101C104C5E0DF9DBC2E6 -:104030008BEC1C07FFC061F5EB10CCC030D0331CFB -:104040009FF9D9C28BEC1C07FFC041F1E910CCCF1E -:1040500071F7E9200CEDBB001FC056C053103AF2B7 -:104060000B13001C9F1438F60913001C9F580B5E9D -:104070006D3209C02831F9002C6B001302F1EC56A7 -:1040800004013800008001013900010000094201EB -:104090000D02F1EC56030000000100F9DBC28BE0D9 -:1040A0002C03FF5E3D123CC0E2F80C111F1699ABC9 -:1040B0007BBFBBF7EA135BF60C0A4BA1795E2B5C66 -:1040C0003B5EFB3FFCA19CA17B5C0C5EFC189B58FB -:1040D0000B5F5CC0245C3B300A580B5E0BD021E0C8 -:1040E00067041EFE9FFE5A189B300CCF6B0000D752 -:1040F000F1206D109A129BFAEB0010300C503CFA34 -:10410000CBFFE01A9CE0A037BB1891E066A384EADD -:10411000168001300BFACCFFF05D161897407C58E2 -:104120000CC040300C407BB60C5807C081FAEA0046 -:104130002830083009E0A03BA1C1A05801C1D79A9E -:104140000C581CC1F1FAEA002030083009EA193F86 -:10415000E0E0A03B93C0C05817C141FAEA0020300C -:10416000083009EA19BFE0E0A03B88C451300A30AA -:104170000BEA1B3FF0CD595821C061FAEA0020CD6F -:10418000095817C6D55827C041FAEA0028CC9930FB -:1041900005EA158000F06300005811002EF90013A5 -:1041A00002F1EC5604013900008001013A000100DF -:1041B000009C89010D02F1EC56030000000100C2D1 -:1041C000B1408CA17C40ACC0C3EDBC001FC04230EC -:1041D0000A300BCB89300A300BEA1B7FF0CB39ED6C -:1041E000BC001FC0E35807C0613FFBFACCFFF05D85 -:1041F00016C0463003EA137FF0300A069BCA3958CE -:1042000007C0613FFBFACCFFF05D16C026300530D9 -:104210000A0A9BC9895817C0F140ACA17C9A0CC00E -:1042200043581CCD94CD5B581CCD34300A300BEA7A -:104230001B7FF0C88940ACEDBC001FC0E35807C02D -:10424000A13FFBFACCFFF05D16C057408CEDBC00DF -:104250001FCDF33005CDDB322CE06B49A0EA1B000B -:1042600000970C5807C0A13FFBFACCFFF05D16C0C9 -:1042700057408CEDBC001FCC133003EA137FF0CB0A -:10428000DB408CA17CC0F25807C0D7321CE06B49E0 -:10429000A0EA1B0000970C3FFAE06BFFFFEA1B7FD0 -:1042A000FFC519FAEA002030183009FEB0FEDCC064 -:1042B00033300CC0B8FAEA0020EE1B8000FAEB00A5 -:1042C00024D9001302F1EC5604013A0000800101E8 -:1042D0003B000100002332010D02F1EC5603000007 -:1042E00000010000203FFBFACCFFF05D16BA1C9ADB -:1042F0000C581CC1E1FAEA0020E0683BCDEA1866E0 -:104300007FE069A09EEA193FE6FEB0FEC1C112300F -:104310000730023003EA133FF0FAE80020300A3099 -:104320000BEA1B4000FEB0FE0AFAEB0020C248FA7E -:10433000E80020300A300BEA1B4050FEB0FDFF3091 -:10434000083009EA193FE0FEB0FCE4FEB0FECBF80D -:10435000C70020220CFEB0FEE030083009EA193F09 -:1043600090FEB0FDEC30083009EA193FE0FEB0FCE9 -:10437000D114921693E06CB424EA1C8001A577183E -:10438000075037FAEA002004980699FEB0FC8E1414 -:10439000941695FAE80020049A069BFEB0FCBA1425 -:1043A000981699089A0A9BFEB0FE0614901691146E -:1043B000981699FEB0FDC314961697FAE50020E012 -:1043C000A02F9014941695300A300BEA1B3FF0048E -:1043D000980699FEB0FC6A30083009EA194000FEE0 -:1043E000B0FDAD00E188001302F1EC5604013B0082 -:1043F000008001013C00010000371A010D02F1ECC0 -:1044000056030000000100BB2B0C9A0E9B08980A73 -:1044100099FEB0FDA6FAE80028FEB0FC59BB09FEE3 -:10442000B0FC8A00980299FEB0FD9BFAE80020FEDD -:10443000B0FC8214961697E06239EFEA12FEFAE0B9 -:10444000632E42EA133FE604980699FEB0FDC6FAD1 -:10445000EB00109A0CFEB0FE72403CB908FEB0FCB6 -:104460006BFAE80010FEB0FC67FAEB0010FAE80007 -:1044700028FEB0FD76FAEB000430083009EA19C0D6 -:10448000E0FEB0FE17C6D3FAEA000430183009EA9D -:104490001940E0FEB0FE0CC672FAEA0004300830A3 -:1044A00009FEB0FE07FAE80004300AC052300BEAF9 -:1044B0001BBFE0C048300BEA1B3FE0FEB0FC3CFEF7 -:1044C000B0FE231895FAEA00280C980E99FEB0FD6C -:1044D00048FAEB0004403CF8E80008F8EA0010FE57 -:1044E000B0FC2AFAE80028FEB0FD3B04980699FECD -:1044F000B0FD37FAE80004FEB0FC1EFAEB00040A37 -:104500009CFEB0FE1CBB2B00CE8A001302F1EC56C1 -:1045100004013C00008001013D000100005DA2019A -:104520000D02F1EC560300000001009A4CFEB0FEB3 -:1045300018405CB908FEB0FC11FAE80030FEB0FD8E -:1045400022BB09FEB0FBD604980699FEB0FD1BFA0B -:10455000E80004FEB0FC02FAEB0004407C580CC0FA -:1045600030B80530050A99300A300BEA1B3FF0FAE3 -:10457000CCFFFCE0A00F8A5C7C187CC040201CC0F3 -:1045800050C108300A300BC058300A300BEA1B7F8C -:10459000F0FAEB0004322CE06B49A0EA1B00009714 -:1045A0000C9A1C580CFAEA0004C030EE1B80002F55 -:1045B000AD1B0E2FBDD0325EFCD7038001A8E0807A -:1045C00001B0DC80019AFC800137D0800138A480E2 -:1045D0000138A8800138FE80013932800134C4805E -:1045E0000137568001352C80015C5CD401300CFE13 -:1045F000B0FDC8D8020000D401E0A03205E06C0094 -:10460000BAEA1C0000305BB89B300BB88BB8CBB853 -:10461000DBE06C2B7CEA1C0000FACBFFFC32491774 -:104620000A18AA2049CFD1309A300B00871C0013FA -:1046300002F1EC5604013D00008001013E00010042 -:1046400000C869010D02F1EC5603000000010030C2 -:104650000CE0A00A29582CC031302CD802DA0A808C -:10466000015254D401CAFDD8020000EBCD4080E0D5 -:104670006700BAEA170000EF2C0001585CC0A1C225 -:104680006DC200304CAE9CE0A031D0C54DE3CD8072 -:1046900080584CC171CEBCC0A0303CAE8C305CAEFA -:1046A0009CE0A031C3C8FDE3CD8080CBEDC0A0303D -:1046B0002CAE8C305CAE9CE0A031B8C84DE3CD8010 -:1046C00080E3CF9080D7038001A1D8D401E0A03A45 -:1046D000B5E06B2B78EA1B0000970CE06B3DCCEA51 -:1046E0001B8001F94B0128E06B3E14EA1B8001F9A5 -:1046F0004B012CE06B3E1CEA1B8001F94B0130E0C2 -:104700006B3ED0EA1B8001F94B0134E06B3F80EA3D -:104710001B8001F94B0138DA0AD7038001B3E83076 -:104720000CE06B00BAEA1B0000300AB6BAE06A2B54 -:1047300078EA1A0000740AF53A0121580AC0215E8D -:10474000FDF72A0000580AC040302CB6BC301C00CF -:104750002CEC001302F1EC5604013E000080010134 -:104760003F0001000077D2010D02F1EC560300007A -:10477000000100F72A0004581AC061F72C0003A3B7 -:10478000ACB6BC301C5C6C5EFC0000E06C00BAEAAD -:104790001C0000300BB88BB8BBB8CB5EFF0000EB41 -:1047A000CD408020AD18971A9CE0A038F5401C0E33 -:1047B0003CC04318275C57C048280C18275C570E8C -:1047C0009CFEB0EB5F406BFEB0E992FEB0FC882F20 -:1047D0006DE3CD8080D7038001160C8001127880B4 -:1047E000013868301CE06B00BAEA1B0000B6CC5EF2 -:1047F000FD0000D401E06A00BAEA1A0000F52900C1 -:1048000003EDB90001C1C230191788F0081068F82B -:10481000080B091788F00810681808B09930991724 -:1048200088F00810681808B0A9F52900001788F06A -:104830000810681808B0C917892FF9B689F529003A -:1048400003EDB90002C23230191788F0081068F879 -:10485000080B093038178EFC0E1068180EBC983003 -:1048600098178EFC0E1068180EBCA81788F0081058 -:1048700068180800845E001302F1EC5604013F0042 -:1048800000800101400001000076BA010D02F1EC48 -:1048900056030000000100B0C92FFAF529000017E7 -:1048A0008AF40A1068140CB8D9178C2FFCB68CC87F -:1048B0000FD80AEBCD408020FD3007300CFB6C0098 -:1048C0000CFACCFFF0E0A0098DE06C2B7CEA1C0018 -:1048D00000FACBFFF0760950097619501976295065 -:1048E00029FAC9FFF498CBF60A107DA37A98BBF693 -:1048F0000B107DA37B98ACF80C107DA37CFEB0EA76 -:10490000F1582CC02130170E9C5C6C2F1DE3CD801C -:10491000800000EBCD408020FD3007300CFB6C00A8 -:104920000CFACCFFF0E0A0095DE06C2B7CEA1C00E7 -:1049300000FACBFFF0760950097619501976295004 -:1049400029FAC9FFF498CBF60A107DA37A98BBF632 -:104950000B107DA37B98ACF80C107DA37CFEB0EA15 -:10496000C1581CC02130170E9C5C6C2F1DE3CD80FC -:1049700080D7038001534880011648EBCD40E022E8 -:104980000D3017300CFB5C0054FB6C002D30ABFB82 -:104990006B002EFB6C003000327F001302F1EC56EE -:1049A000040140000080010141000100001A1601CD -:1049B0000D02F1EC56030000000100FB6C0031E039 -:1049C0006600BAEA160000ED2C0005580CC2A1E002 -:1049D0006C00B4BACC346CBADC3015BAE5300CFBE0 -:1049E0006C002C303CFB6C002DFACCFFD01A9B32B3 -:1049F00049170A18AA2049CFD1FACCFFD41A9B3202 -:104A0000C9190A16AA2049CFD1E0A00943C0313004 -:104A100027C088FACCFFA8E0A037E2417CACACAC60 -:104A2000D50E9C5C6C2E0DE3CD80E08001B120EBB7 -:104A3000CD40E0216D3017E06600BAEA160000EDC7 -:104A40002C0005581CC2013005FB550054FB6500C5 -:104A50002D30ACFB6C002EFB650030FB6500313067 -:104A60001CFB6C002C303CFB6C002DFACCFFD41AE4 -:104A70009B32C9190A16AA2049CFD1E0A0090AC061 -:104A8000213037ACD50E9C5C6C2EADE3CD80E08040 -:104A90000153D4EBCD40B03007E06C00BAEA1C0003 -:104AA0000019ACCA2E14941695E06C2B7CEA1C00FD -:104AB000002F6C198CFEB0FBA9149800F7E50013C9 -:104AC00002F1EC56040141000080010142000100A6 -:104AD000008FDD010D02F1EC56030000000100160D -:104AE00099089A0A9BFEB0FB4FC02330170E9C5CBE -:104AF0006CE3CD80B0D7038001394C800138A4D459 -:104B000001201DE06CC305EA1C80011A9B198AB6BE -:104B10008A199AB69A19ACBAAC3018FAC9FFFE30A5 -:104B20000A318B302CFEB0974F1BACE04C0048C1D3 -:104B30009130ACBA8C311CBA9C30291A9A318B3026 -:104B40002CFEB09715C0312FFDD80230ACBA8C3096 -:104B50000CBA9C30291A9A318B302CFEB09708CFB2 -:104B60004B300CCF2B0000D401201D1A9C300BB809 -:104B70008BB89B30ACBA8C311CBA9C30291A9A3154 -:104B80008B302CFEB096F42FFDD802D401201D1AD4 -:104B90009C300BB88BB89B30ACBA8C300CBA9C30C4 -:104BA000291A9A318B302CFEB096E22FFDD802D410 -:104BB00001201D1A9C300BB88BB89B30ACBA8C30DE -:104BC0000CBA9C30291A9A318B302CFEB096D02F1B -:104BD000FDD802EBCD4080201D1897E06CC30E007D -:104BE0001EA5001302F1EC560401420000800101F1 -:104BF00043000100003066010D02F1EC5603000095 -:104C0000000100EA1C80011A9B198AB68A199AB61B -:104C10009A19ACBAAC3018FAC9FFFE300A318B30A1 -:104C20002CFEB096E31BACE04C0048C22130ACBA7D -:104C30008C31FCBA9C30291A9A318B302CFEB096FC -:104C4000A9C0412FFDE3CD808030380E99310A3163 -:104C50008B302CFEB096CACF6030ACBA8C300CBA18 -:104C60009C30291A9A318B302CFEB09693CEBB30F3 -:104C70000CCE9BEBCD40C0203D1897E06CC1D4EA30 -:104C80001C80011A9A1989B4891999B4992FCCB941 -:104C900008FAE900042FEBF1DBC008FAC9FFFC3089 -:104CA0002A318B302CFEB096A11896E06C10C8EA21 -:104CB0001C00001BCBB88BFB3B000BB89B1BDCAE76 -:104CC0008C1BECAE9C1BFCAEACFB3C0008AEBCFBF2 -:104CD0003C0009AECCFB3C000AAEDC30ACBA8C31F7 -:104CE0001CBA9C30291A9A318B302CFEB09652583F -:104CF00006C0300C9CC028300C2FDDE3CD80C0EB0B -:104D0000CD40C000B5CD001302F1EC5604014300C4 -:104D1000008001014400010000244E010D02F1EC6D -:104D200056030000000100201D1897E06CC2FCEA49 -:104D30001C8001FACBFFFF198AB68A199AB69A1914 -:104D4000ACBA8CFEB094CA189630181A99300A3151 -:104D50008B302CFEB0965C1B8BE04B0048C2613060 -:104D6000ACBA9C31FCBAAC3029FACAFFFF318B30A7 -:104D70002CFEB0962130ACBA9C300CBAAC3029FA7B -:104D8000CAFFFF318B302CFEB09616301B0C9CFEF8 -:104D9000B0978C30181A9930AA318B302CFEB0960F -:104DA000371B8CAE8C301CC048E06B00FFAE8B2FE5 -:104DB000FDE3CD80C00000EBCD40FC207D1893E0EA -:104DC0006BBFE4EA1B8001FACAFFF4169C2FCCB932 -:104DD00009B528B909B5281A9C178AB88A179AB84C -:104DE0009A2ECBB70AFAEB00043056FEB094761830 -:104DF000953018FAC9FFF4300A318B302CFEB0968A -:104E000007FB3C000CE04C0048E081009830ACBA55 -:104E10008C3007BA9730291A9A318B302CFEB09516 -:104E2000CB1892C051049C009647001302F1EC5637 -:104E3000040144000080010145000100004EF6011C -:104E40000D02F1EC560300000001002F9DE3CD8020 -:104E5000FC30BCBA8C301CBA9C30291A9A318B3089 -:104E60002CFEB095BB1892CF10301B0A9CFEB09759 -:104E70002F30CCBA8C340CBA9C30291A9A318B3032 -:104E80002CFEB095AB1892CE1030ACBA8C318CBAE7 -:104E90009C30291A9A318B302CFEB0959F18923095 -:104EA000AB0A9CFEB097145802CD00302B0A9CFE32 -:104EB000B0971A3018FAC9FFF4302A318B302CFE23 -:104EC000B095B81892FB3C000CEDBC0000C0730C10 -:104ED0009CFE3600015C7CCEA130065802CB6030CF -:104EE00068FAC9FFF4303A318B302CFEB095A21825 -:104EF00092CAC0FB3B000DA96BFB3C000C180BBA1F -:104F00002BFB3C000FA96CFB35000E1805BA35FBD6 -:104F10003C0011A96CFB3400101804BA4430CCBA20 -:104F20008CBA9730291A9A318B302CFEB0955618CE -:104F300092C8C09A2CA94CA68C9A2CA69C5C85EA97 -:104F40000C1408A6ACA6B55C84E80C004D50001308 -:104F500002F1EC5604014500008001014600010009 -:104F600000DB3D010D02F1EC5603000000010014CE -:104F700008A6CCA6D45C765816FE95FF7A3012C7E8 -:104F80007B3002C75BD70380006DB08000738080E8 -:104F9000007398800070E48000708CD4011699141E -:104FA0009B300A203CC040201CC060C088129CC5B9 -:104FB000AE189AC048129CCDAE189A149CD8022004 -:104FC0008D1A9CE06BBEF8EA1B8001320AB709B962 -:104FD00028208ACFD11A9CFE6B000C760BF7DBC021 -:104FE00004F80B051CAB6C2F8D5EFCFE6A00007490 -:104FF00009A7C9340BF7EC006C124C950C5EFDD47C -:1050000001E06BE1C1EA1B00E4163CC123E06BC385 -:1050100081EA1B01C9163C301CC062CE8F3FFB31B8 -:105020001CC1DCD80ACE3F3FFB310CC18CD80A3002 -:105030000CCDDF3FFB311CC12CD80AFE6C00087878 -:105040000CF9DCC0015EFCD401CF9FCFF0D80AFE82 -:105050006C0008780CE21C000C5EFCEBCD40E01804 -:10506000961697E0650D28EA150000F0150000007F -:105070004996001302F1EC5604014600008001013C -:1050800047000100006486010D02F1EC56030000A8 -:10509000000100FE6C0004780BE01BFFC0EDD6C0E1 -:1050A0000616460C9B5807C0B5E01B00FFE41BFF2B -:1050B00000A967EFD7C110A96716470E9BF7DBC0A1 -:1050C00018EA1BA500990BCD6F8B1CF0150000E3AF -:1050D000CF80E0D4013FFB303CFEB0FFD3D80AFEC6 -:1050E0006C0008780CA59CF9DCC0015EFC0000D4C3 -:1050F00001189B30CCFEB0FFC5CF3FD8020000EBBB -:10510000CD40E016973016189B302CFEB0FFBA5CED -:1051100057C0C0E0670D28EA1700006E153FFCCEAF -:105120008F18966E1C18458F150C9C5C5CE3CD8027 -:10513000E00000D401189B301CFEB0FFA3D80AD4B5 -:10514000013FFB30FCFEB0FF9DCCBFD8020000EB5E -:10515000CD408018973FFB30ECFEB0FF935C57C00A -:1051600030CEFFC028301C580C5F1CE3CD8080D4AB -:10517000013FFB30DCFEB0FF85D80AD4011698F160 -:10518000EB108BC02CD802D4011698F1EB110BC098 -:105190002CD80200A01E001302F1EC5604014700B7 -:1051A000008001014800010000F36D010D02F1ECE7 -:1051B00056030000000100EBCD40C01696F1D9C0A7 -:1051C0000814990C9A300B0C970E4BC04CE3CD8011 -:1051D000C00000D631204D1494169512961091E01F -:1051E0006CC2B8EA1C8001B90AFAEB00083003FC73 -:1051F000178000FEB0FF0A18920E0240570E9BF770 -:10520000DBC003201BF7DBC003C0C8FACCFFF816D5 -:105210000CB884A984E9E51184A985201BF7DBC0BB -:105220000358045C25CF310E06FC1C80001837C0E3 -:1052300042FC178000C0980437C073FC1C808018A3 -:1052400037C032FC178080E06C0101EA1C808018B6 -:1052500036C063FC168080FE36FF00C098301CEA22 -:105260001C80801836C0420C32C02204960C95A1D6 -:10527000C5E015FFFCE015FFF8C0C8E20C1518C02A -:1052800050300CC78F681C1843C85F069C68131801 -:1052900043E0640D28EA1400000C37C702C2DF683F -:1052A0001C18430E98E018FF00109CFE3CFF00EA1B -:1052B0000C0D4C0C9BE01B00ACA8001302F1EC564B -:1052C00004014800008001014900010000B3D6013B -:1052D0000D02F1EC56030000000100FF0016385FDC -:1052E00029FAEA0008BB1B0E9B5C5BC1F0C0282FAB -:1052F000880E9AE01AFFF81438CFB30E9EFDDEC078 -:1053000003C140300BC06811371A901600A0872FD8 -:10531000FB1C3BCFA314970A37C082400B0EAB4057 -:105320001B0EABFAEA0008BB1BA39CEE0B1603187E -:105330002BC068402C0EAC403C0EAC201B580BCF51 -:10534000A15C59C1700C980C9BF7DBC003C0F0C086 -:1053500068113C1A9A160AB48C2FFB588BCFA340C5 -:105360000C0EAC401C0EACC0282F88109C5C5CCF8F -:10537000D1301CEA1C80801837C932E20C1518C0E5 -:1053800060300B3FFCCE1E681C18433FFCCF7E06EE -:105390009C681318430437C8F3FC178080C8CB8976 -:1053A00013405C2FCDDC32EBCD42FF202D18901442 -:1053B00097300300961692FC1C808018305F210CF9 -:1053C000955C550C25C0683FFCCD9E069C68131863 -:1053D00043E0640D28EA1400005807006BBE001378 -:1053E00002F1EC5604014900008001014A0001006D -:1053F00000261D010D02F1EC56030000000100C360 -:1054000050C9FE681C18433009C1585807C0900C99 -:1054100035C071053B1A9AF40C0B0B2FF620172F91 -:10542000F52FFC5C5C588CCF23BB0A0A9C208CB9FE -:105430001B2F89F9D9C010E04C0100C054AB0ABB46 -:105440001B300CCF0BFB3C000F580CC0B05801C0F8 -:1054500040300CCB4EC048300B3FFCC88E681C1847 -:10546000435801CC40CBBECC4B8913009C2FEDE3BD -:10547000CD82FFE06B4690EA1B0000F6FA00ECF6E6 -:105480000A002AF54C0078F6FC00EC2FFCF74C00E3 -:10549000ECF6FC00EC585C5E3FF6FC00EC201CF7E0 -:1054A0004C00EC5EFD0000300CE06B4690EA1B0007 -:1054B00000300AF74A00F0F6FA00EC580A5E0D7761 -:1054C000EAF74A00F0F6FA00EC201AF74A00ECC0BE -:1054D00078F60C002A75F9F54900782FFC584CCF66 -:1054E000955EFDEBCD40803007E06C08E8EA1C00DB -:1054F00000F93C03B0E0A01D25C038C62C2FF700F2 -:10550000EF2E001302F1EC5604014A000080010165 -:105510004B0001000099A6010D02F1EC56030000BA -:10552000000100E06C4690EA1C0000298C198C18E0 -:1055300037CF73E3CF808080018540EBCD40E0160C -:10554000973006E0654690EA150000EB3B008D16AB -:105550009A2FFAEB6A008DE04B0033C045300BEB1D -:105560006B008DEB3B008C583BC215780BEB4B006E -:105570006C781BEB4B0070782CEB4C0074300CE01B -:10558000A01CE8E06C08E8EA1C0000F93B03B02F1F -:10559000FBF96B03B0F93B03B0EB3A0068143BC076 -:1055A00053300BF96B03B0CB0FC91FEB3C008C18C9 -:1055B0009B2FFBEB6B008CE04C0065C045332CEB64 -:1055C0006C008CEAFC00F0580CC070AE8C301658A1 -:1055D000ACC03130ACAE8C5C560C9CE3CD80E0802E -:1055E00001852CEBCD40FC300C300AC0E8F40B10E8 -:1055F00035A36B0E0B17C95809C06017E92E0BF6BF -:10560000090F8B164C2FFAE06708E8EA17000058DC -:105610003ACEE5E0A01CC8E0664690EA160000E03D -:10562000A01CFE008CFD001302F1EC5604014B009F -:10563000008001014C000100008D8E010D02F1EC93 -:1056400056030000000100ED4C00E83005ED450078 -:10565000F03004C0588DB5789C8DCC2FF45834C4EC -:1056600054E8021035A3620E0205CC580CC2A00803 -:105670009CC5DCECF300E805ECE4CBFFE0F60C0F96 -:105680008B660C186BC17005ECE4CBFFCCF60C0FED -:105690008C580CC05005ECF60C0F8CC10F05EC2F8C -:1056A000FCA4EC05EC05DB163CC053640CEC0409CF -:1056B0002CA4E5670C580CC050660B670C184B8780 -:1056C0000B5814CCC1EF3C00DAF80C101C0E0CF88F -:1056D000FC011C8D9CECFC00E8789B2BABE04B00A4 -:1056E0008DCBA2788B8DBBCB8BECFC00E8780CE0EB -:1056F000A01CB0EEFC03B4189B2FFBEF4B03B4E0EF -:105700004C03E9C033EF4503B40C9CFE3CFF6C3501 -:1057100009AD0BB92A2089CFD1E3CF80FCD7038014 -:10572000018580800185F880018608D4213007E05A -:10573000644690EA140000E8FB00E8F7470040E008 -:105740006B08E8EA1B00000040F3001302F1EC567E -:1057500004014C00008001014D00010000E736010A -:105760000D02F1EC56030000000100F8091035A30A -:1057700069160913E8F20800256A8C582CC541F017 -:1057800006101C12066D2C581CC4E1E8FE00E86DE2 -:105790004C582CC0B17CDC583CC0646D7C2FFCEDB7 -:1057A0004C005CC038ED47005C6D4C584CC0B17C7F -:1057B000DC585CC0646D7C2FFCED4C005CC038EDA7 -:1057C00047005C6D4C588CC0B17CDC588CC0656D5A -:1057D0007C2FFCED4C005CC038ED47005C6D4C59F3 -:1057E0000CC0B17CDC590CC0656D7C2FFCED4C000D -:1057F0005CC038ED47005C6D7C6D3B314AF60A0CAD -:105800000A143CC0B47C0C6A8B168C9D0C6A8CE824 -:10581000FB00E8F74C0040C078ED47005C7C0B6A69 -:105820008C184B9D0B6A8C581CC641F00C101C1830 -:105830000912966D2CEDBC0000C5C26D3CEDBC009C -:1058400002C28269DCFC1BC080FEB0E3DBC362E8FD -:10585000FB00E8766AFE3AFF6FE04A0123C2E37676 -:105860007BF6CCFF6FE04C0123C28300AC850013B4 -:1058700002F1EC5604014D00008001014E000100D0 -:105880000072FD010D02F1EC560300000001006DF5 -:105890007C2FFCED4C005CE8FB00E86D7C585CC3A1 -:1058A00054760C6A8A148C970C6A8CE8FB00E8F733 -:1058B0004C0040D82AEDBC0001C15269DC301BFE0F -:1058C000B0E3A6C0D3E8FB00E8766C2A6CE04C009D -:1058D000B5C062767C2A6CE04C00B5CDA3ED4700E4 -:1058E0005CCDBBEDBC0004CD8269DCFEB0F506BF2B -:1058F000DBE0683334EA183333E0693333EA1940C4 -:105900001DFEB0F519CEC3CC4BED47005C760A6A9C -:105910008C184A970AD82A800115948001157C803A -:10592000013868800138A4D421203D3009E0683F67 -:1059300020EA1800007058300EC2185859C1D4F22D -:10594000071501E0662724EA160000F135000D1C5A -:1059500015EC05001520250B851A940E04A885F179 -:1059600035000D1C15EC05001620160D861A950A3B -:1059700007AE962FF95C592FFE5C6EF137000D0EC5 -:105980003ECDD5581BC1955C6BC158F60810680018 -:10599000AE8A001302F1EC5604014E0000800101B2 -:1059A0004F00010000CD46010D02F1EC560300004E -:1059B00000010018082668118E585EC0C15859C0F1 -:1059C000A41A9EFC09001E11A7BC8711B8BC982F11 -:1059D000F95C59201B5C6B581BCEB4300CC148F8E5 -:1059E0000B1068140B3008B6883058B6A81A98F215 -:1059F0000C010EF00E00182028118EB6CE1198B6AC -:105A0000D82FFC5C6C123CCEC5129C5C5C2FDDD8A0 -:105A1000220000EBCD40C0E02D0218189716961A10 -:105A20009C300A300BB91BF8EB0008300CC188F829 -:105A30000B10680E0B17AA585AC100E06A3F20EA03 -:105A40001A000017ABF40B0F8B2F3B178B580BC0B2 -:105A500051301B1A9A180AB48B2FFC5C6C0D8B16F4 -:105A60003CCE75FACAFFF00D8B0E9CC70F300BC1F0 -:105A7000F82FF95C6958E9C1941A9A120AF52800BE -:105A8000005808CF71F20910680E093008B288304A -:105A900058B2A8FACEFFF0F60810681C0811CEB272 -:105AA000CE11D8B2D83019B4892FFB5C6B183BC02B -:105AB00034300900DF19001302F1EC5604014F00E5 -:105AC000008001015000010000DD2E010D02F1EC0B -:105AD00056030000000100CE1B300BC228E06826F0 -:105AE00024EA180000F93E000DFC0E1006100EFD11 -:105AF0000E00D2B22EF93E000DFC0E1006100EFD67 -:105B00000E00D4B23E2F3C198CF80C10061808F188 -:105B10003C00D62F89B28C301CB48C2FFB5C6B58A8 -:105B2000ABE08400E6E06C3F20EA1C0000F80B03C9 -:105B30002CF93A000D581ACF25585BCF003009C018 -:105B4000382FF95C6958E9CEA41A9A120AF5280090 -:105B5000005808CF71F20910680E093008B288B2F7 -:105B6000AB16985898F9B802052FE8FE08001FC038 -:105B700098C258C418C5D8C6E8CCFBCB1BC8C8CA45 -:105B8000C8E0682624EA180000F93E000DFC0E105B -:105B900006100E28EE9C0EB22EF93E000DFC0E10E3 -:105BA00006100E28CE9C0EB23E2F3C198CF80C101D -:105BB00006180828A8900CB24CCAFBE0682624EA14 -:105BC000180000F93E000DFC0E1006100EFD0E0030 -:105BD00092B22EF93E000D003BE9001302F1EC56A3 -:105BE00004015000008001015100010000C993012F -:105BF0000D02F1EC56030000000100FC0E1006102F -:105C00000EFD0E0094B23E2F3C198CF80C100618B5 -:105C100008F10C0096B24CC92BE0682624EA180063 -:105C200000F93E000DFC0E1006100EFD0E00B2B283 -:105C30002EF93E000DFC0E1006100EFD0E00B4B243 -:105C40003E2F3C198CF80C10061808F10C00B6B267 -:105C50004CC75BE0682624EA180000F93E000DF00E -:105C60000E003E7D2E931E2F3C198CF00C00382B1D -:105C700048900CB24CC63BE0682624EA180000F9B4 -:105C80003E000DF00E003E208E9C0EB22EF93E001E -:105C90000DF00E003E206E9C0EB23EF93E000DF05F -:105CA0000E003E204E9C0EB24E2F3C198CF00C0084 -:105CB000382028900CB25CC42BE0682624EA180037 -:105CC00000F93E000DF00E003E2E0E9C0EB22EF995 -:105CD0003E000DF00E003E2DEE9C0EB23EF93E0051 -:105CE0000DF00E003E2DCE9C0EB24E2F3C198CF0C6 -:105CF0000C00382DA8900CB25CC21B00A0B200139F -:105D000002F1EC5604015100008001015200010033 -:105D1000005C58010D02F1EC56030000000100E0A8 -:105D2000682624EA1800002F3C198C1808F13C0062 -:105D3000F7B2CCC16B300CC0282FFC5C6C58ECC0A7 -:105D4000741A9BF60C060A580ACF81AC8C300CC032 -:105D5000B8300BE06A3F20EA1A0000F40C032A2F47 -:105D60003AB48B2FFC5C6C58ACCF45FE3DFDE8E3AC -:105D7000CF80C0EBCD40FC203D169214963017F832 -:105D80000B1518C341E06C2908EA1C0000EC05154E -:105D9000051805301CF80209448ABC086CC0D08A7A -:105DA000B3FAE300045006E06CBCF8EA1C8001FE84 -:105DB000B08EAC302CC528301AEB2B0002F9D2B0D3 -:105DC00008E0A00949C1108ABB049AFAEB0004500C -:105DD00006E06CBCF8EA1C80012F0CFEB08E968A9F -:105DE000BC1844AA34C388302CC388581CC341E073 -:105DF0006C2908EA1C0000EC0515051805301CF894 -:105E00000209448ABC086CC0E18AB3FAE30004507A -:105E100006E06CBCF8EA1C80012E0CFEB08E760009 -:105E200097D3001302F1EC560401520000800101E7 -:105E30005300010000E3E3010D02F1EC5603000002 -:105E40000001003037C1A8301AEB2B0002F9D2B0A4 -:105E500008E0A00965C0E08ABB049AFAEB00045090 -:105E600006E06CBCF8EA1C80012D0CFEB08E60C010 -:105E70002830378ABC088CAA3C0E9C5C6C2FDDE372 -:105E8000CD80FC80016534800165D8D401FEB0BFAF -:105E9000A5D8028000D294D401216D300AFB5A00AB -:105EA00054FB6A002D30A9FB69002EFB6A0030FB11 -:105EB0006A0031305AFB6A002CFB6C002DFB6B0032 -:105EC00030FACCFFD41A9B32C9190A16AA2049CF3E -:105ED000D1C23C2EADD80AD401FEB0B1BBD80A80E5 -:105EE00000B70CD4015C5CFEB0B1CAD80AD70380FD -:105EF00000B738300A593CC0D2E0692908EA1900D5 -:105F000000A57C120C98BCF80B0A4CA19CC0223056 -:105F10001A149C5C6C5EFCEBCD40E020BD3017FB9E -:105F20002B003C5C5B587BF9BB02072FEBFE0B00A0 -:105F30001FC088C318C448C6A8C898CB08CBA8CC33 -:105F400048FB2600858C001302F1EC560401530037 -:105F5000008001015400010000F7CB010D02F1ECBB -:105F600056030000000100003DFACCFFC01A9B322E -:105F700049190A16AA2049CFD1FB2B003EF9D6B009 -:105F800008FEB0BB65582CC0D10C9CFEB0BCB23032 -:105F9000075006E06CBC0CEA1C8001FEB08DDACB29 -:105FA00018583CE08100AF5006E06CBC0CEA1C8045 -:105FB000012F8CFEB08DCECA58FB26003DFB2B0076 -:105FC0003EF9D6B008FEB0BBF1583CE081009B50D2 -:105FD00006E06CBC0CEA1C80012F0CFEB08DBAC927 -:105FE00018FB1B0064FACCFFFCFEB0BCA1FB2C002C -:105FF00005582CC111FB2C0004FEB0BC7B3007FB04 -:106000002B0004500BE06CBC0CEA1C80012E8CFEB3 -:10601000B08DA0C778583CC751FB2B0004500BE053 -:106020006CBC0CEA1C80012E0CFEB08D93C6A8E05F -:10603000A00E7C582CC101FB26003D0C9CFEB0BC80 -:106040005930075006E06CBC0CEA1C80012D8CFE18 -:10605000B08D80C578583CC551FB2B003D500BE0FE -:106060006CBC0CEA1C80010074C8001302F1EC56F1 -:10607000040154000080010155000100009D7301DE -:106080000D02F1EC560300000001002D0CFEB08D56 -:1060900073C4A8FB26003D0C955855C131301CE057 -:1060A000A00106582CC1410C9CFEB0BC35300750F5 -:1060B00005E06CBC0CEA1C80012C8CFEB08D5CC32E -:1060C000385825C311E0A02E3F582CCEE0583CC2D2 -:1060D000B15005E06CBC0CEA1C80012C0CFEB08DAC -:1060E0004BC228FACCFFC41A9B32C9190A16AA203F -:1060F00049CFD1FEB0BCA2C178FACCFFC41A9B3202 -:10610000C9190A16AA2049CFD1E0A02B2DC0C8FB7F -:106110002B003D500BE06CBC0CEA1C80012B8CFE6C -:10612000B08D2A30070E9C5C6C2F5DE3CD80E08043 -:1061300000CAE48000CC408000CDC4800171C080E2 -:106140000157208000CD888001B1B88000CEAC809E -:1061500001ABD880006FE8D401301CE06B2BACEAB7 -:106160001B0000B68C305A300B300CFEB0FE3A5893 -:106170002CC031302CD802305A305B300CFEB0FECF -:1061800031582CCF80C73DE0A02AC400CF93001324 -:1061900002F1EC5604015500008001015600010097 -:1061A0000008B8010D02F1EC56030000000100DA0E -:1061B0000A0000EBCD40C03017305A305B301CFE77 -:1061C000B0FE22583CC0213037E0662BACEA160006 -:1061D00000ED2C0000583CC030581CC091305A30A3 -:1061E0000B301CFEB0FE10583CC0213037300CACD8 -:1061F0008CC4FDE0A02E420E9C5C6CE3CD80C0D42C -:1062000001300CC66C582CC031302CD802583CC020 -:1062100031303CD802DA0AEBCD4080E0672BA0EAAF -:10622000170000E0A02EBA8F2CE0A02EBD8F0CFE30 -:10623000B08B988F1C6E2CE06B55CCEA1B8001F95B -:106240004B00A8E06B5604EA1B8001F94B00ACE060 -:106250006B5650EA1B8001F94B00B0E06B56D4EA54 -:106260001B8001F94B00B4E06B58F4EA1B8001F984 -:106270004B00B8E3CF90808001B3E88001B3F48095 -:10628000006DB0D401300BE06A2BA0EA1A00007454 -:106290002AF53A00A1580AC021D80A581CC031C0BA -:1062A000AC189B169C5C6CD8020000D401300C002A -:1062B000F8BC001302F1EC56040156000080010105 -:1062C0005700010000B703010D02F1EC5603000076 -:1062D000000100C0ACD80AE06B2BB2EA1B0000F74B -:1062E0002C00005EFC0000E06B2BB2EA1B0000B645 -:1062F0008C5EFDEBCD40E0201D18953017E0662B3D -:10630000ACEA160000ED2C0000581CC2E18C2C2FCA -:10631000FCAC2C8C2CE04C004CC0D5300CAC2C30A0 -:106320002CAC8C305A300B301CFEB0FD7F583CC07A -:106330002130375815C701E06C2BA0EA1C0000780B -:106340001C2BDC198C581CC0A18C2C59FCC6452F69 -:10635000F6ED2C00002FFCAC8CC5E82FE6ED2C00F0 -:10636000002FFCAC8CC588582CC2515815C131E0A7 -:106370006C2BA0EA1C0000781C2BDC198C581CC06C -:1063800061ED2C00012FFCAC9CC058ED2C00022FBD -:10639000FCACACED2C0001581CC3E5305A300B307E -:1063A0000CFEB0FD43582CC031302CC378303CACCF -:1063B0008CC328583CC301E06C423AEA1C800019A7 -:1063C0008CBA8C1A9BE06C2BA0EA1C0000780CE0C5 -:1063D000A0094A00B57A001302F1EC5604015700F7 -:1063E00000800101580001000020E8010D02F1ECDD -:1063F000560300000001005C5C582CC0E1305A30AC -:106400000B301CFEB0FD24583CC0213037301CC777 -:10641000EF304CAC8CC128583CC101305A300B30A5 -:106420001CFEB0FD15583CC0213037300CAC9CAC84 -:10643000AC302CAC8CE0A029A30E9C5C6C2FFDE34F -:10644000CD80E080016A90D401301CE06B2BACEA77 -:106450001B0000B68C305A300B300CFEB0FCF858E4 -:106460002CC031302CD802305A305B300CFEB0FCDE -:10647000EF582CCF80C31CE0A02982DA0AD7038012 -:1064800001AB84EBCD40C03017305A305B301CFE7E -:10649000B0FCDE583CC0213037E0662BACEA160079 -:1064A00000ED2C0000583CC030581CC091305A30D0 -:1064B0000B301CFEB0FCCC583CC0213037300CAC4B -:1064C0008CC0BCE0A02CFE0E9C5C6CE3CD80C08038 -:1064D0000152548001B2C8E06C2BACEA1C000030C1 -:1064E0000BB82BB89BB8AB5EFD0000EBCD4080161F -:1064F00097301A0F8BF60B00421D001302F1EC5679 -:10650000040158000080010159000100006053019E -:106510000D02F1EC560300000001001068F80B0BAF -:106520000A0F8BF60B1068180BB69A305B0F89F2C6 -:106530000910681809B2AB0F8BF60B1068160CB86F -:10654000CACEBE0F8C2FFCAE8CE3CF80800000D46F -:1065500001E06CC238EA1C8001FEB08B55E06C0093 -:10656000ACEA1C0000300BB88BB8BB301AB8CAB804 -:10657000DAB8EBB8FBB89BFEB08A2A2C0C988CDA00 -:106580000A0000D401E06CC230EA1C8001FEB08B2E -:106590003BFEB08A1D2C0C988CEDBC0005C023DAA4 -:1065A0000AE06C00ACEA1C0000300BB88BB8BB30C2 -:1065B0001AB8CAB8DAB8EBB8FB19AA581ACF11B88A -:1065C000AB30EA308B301CFEB0FC54583CCE9130DE -:1065D0003CD802EBCD40C0E06C3F20EA1C000078C4 -:1065E0004B179B785C19961606FEB089F12C0C9817 -:1065F0008CEDBC0005C033E3CF90C0E06700ACEA8F -:106600001700000FBC580CC051301CAEBCE3CF903B -:10661000C00FAC5C56C090581CCEF100CF94001354 -:1066200002F1EC5604015900008001015A000100FA -:1066300000F598010D02F1EC560300000001003056 -:106640001CAECC300CAEACE3CF90C05C5CC1610F33 -:10665000CC581CC08130EA308B301CFEB0FC1C30A2 -:106660000CAECC30EA308B300CFEB0FC15582CCD83 -:1066700060301CAEACE3CF90C02FF7EF2C00005C75 -:106680005C187CC050202CC060E3CF90C0C0BCE33D -:10669000CF90C0C44CE3CF90C0D70380006DB080D2 -:1066A000015254EBCD40E0202DE06C28E4EA1C00C0 -:1066B00000780C2A8C9807E06500ACEA1500000B06 -:1066C000DC581CC0A1E047002EC074300CAADC309E -:1066D0001CCBBC300CCA9C8A460C37C1B5EB2C00D5 -:1066E000072FFCAAFCEB2C0007582CC155302CAA14 -:1066F0009C300CAAFCBB17E06CC1ECEA1C8001FECC -:10670000B08A9433CCAA4C301CC9FC301CC8DCC005 -:1067100038300CAAFC2FEDE3CF90E0EBCD40E02029 -:106720002DE06C28E4EA1C0000780C2A8C9807E025 -:106730006600ACEA160000E047002DC194ED2C0085 -:10674000DA16001302F1EC5604015A000080010130 -:106750005B000100004A23010D02F1EC560300002A -:1067600000010000062FFCACECED2C0006582CC1FB -:10677000353005AC95301CC7AC300CC68CACE58C04 -:1067800046BB17E06CC1F8EA1C8001FEB08A60C00D -:1067900038300CACEC2FEDE3CF90E0EBCD4080E057 -:1067A0006CC228EA1C8001FEB08A52E06728E4EA45 -:1067B000170000E0A02C4C8F1CE0A02C4F8F0C3059 -:1067C0000CE06B00ACEA1B0000B69C6E1CE06B5941 -:1067D00034EA1B8001F94B01C8E06B5968EA1B8061 -:1067E00001F94B01CCE06B59B8EA1B8001F94B0170 -:1067F000D0E06B5BB8EA1B8001F94B01D4E06B5C25 -:1068000014EA1B8001F94B01D8E3CF9080D70380B5 -:10681000006FE88001B3E88001B3F4D401300BE0ED -:106820006A28E4EA1A0000741AF53A01C1580AC04D -:1068300021D80A5C6CC031C12C189B169C5C6CD8AA -:10684000020000D401300CC12CDA0A581C5F0CE0A5 -:106850006B28EDEA1B0000B68C5EFDE06B28ECEACD -:106860001B000000BD3D001302F1EC5604015B006B -:10687000008001015C000100005E0B010D02F1ECE3 -:1068800056030000000100F72C00005EFC0000E051 -:106890006B28ECEA1B0000B68C5EFDD401189A3020 -:1068A0001C1789F2091068F4090B0C1789F20910FA -:1068B000681409B29C30EC1789F20910681409B207 -:1068C000ACE06C28EDEA1C0000F9290000178CF8F8 -:1068D0000C1068180AB4C9178C2FFCB68CCC5FD882 -:1068E0000A0000D671203D14901691B906E065AFFC -:1068F00028EA1580010C9A0E9B5D151893009A02E8 -:106900009B5D153005EA157FF05803C087580CC60B -:1069100006582CC091404CB911C0385823CFA13033 -:106920002C2FDDDC72580CC1A10C9A0E9B30080A8A -:1069300099E0A02A19C050404CB911300CCF2B322D -:106940001CE06B49A0EA1B0000970C3FFAE06BFFCC -:10695000FFEA1B7FFF404CB91BCE3B581CC0D13017 -:1069600008F06900000C9A0E9BE0A029FDCE904033 -:106970004CB911301CCD6B5803C121404CB91140AA -:106980005BE0A01AAB189300D3F8001302F1EC56A9 -:1069900004015C00008001015D0001000034B301CE -:1069A0000D02F1EC560300000001005C7C202CC0BD -:1069B00072322CE06B49A0EA1B0000970C069CCCBD -:1069C0003B0C9A0E9B30080A99E0A029DFC0A10079 -:1069D0009A029B30080A99FEB0ED15404CB91BCDC8 -:1069E000CB300A300B00980299FEB0ED0C404CB948 -:1069F0001BCB7B3008E069C800EA19C09C0C9A0EDA -:106A00009BFEB0EDA9CEE33018E069C800EA19405A -:106A10009C0C9A0E9BFEB0ED9DC113009A029B3018 -:106A2000080A99FEB0ECEF404CB91B322CE06B49E0 -:106A3000A0EA1B0000970C301CC86BE06882FEEADD -:106A400018652BE0691547EA193FF70C9A0E9BFE73 -:106A5000B0ECD91494169530083009FEB0ED7C30B6 -:106A60000AC052300BEA1BBFE0C048300BEA1B3FA4 -:106A7000E008980A99FEB0EBB1FEB0ED98502CFEFC -:106A8000B0EDAF14941695E068E4F2EA18BCD5E0D6 -:106A900069E8E7EA193E4BFEB0ECB5BB2B300AEAD9 -:106AA0001AF800E06B2E42EA1B3FE60040F30013A9 -:106AB00002F1EC5604015D00008001015E0001005E -:106AC00000A178010D02F1EC56030000000100085E -:106AD000980A99FEB0ECA9149816990C9A0E9BFE90 -:106AE000B0EB5ABB09FEB0EB57149416953FE8E0A3 -:106AF00069FFFFEA19BC8FFEB0ED3EC0D33008300D -:106B000009EA193C90089A0A9BFEB0ED37C0420092 -:106B10009A029BC688089A0A9B08980A99FEB0ECCC -:106B20008414961697E0682E11EA188157E0693FA1 -:106B3000A0EA193F50FEB0EC78E0684358EA188CA0 -:106B400012E069718FEA193FBCFEB0EB590C980E48 -:106B500099FEB0EC6A14921693E068E84BEA18418B -:106B6000A5E06952B7EA193F010C9A0E9BFEB0EC02 -:106B70005CE068BD0BEA18DAF3E06970E8EA193FF7 -:106B80008CFEB0EB3D0C980E99FEB0EC4E30083008 -:106B900009EA193FE0FEB0EB3308980A99FEB0EC21 -:106BA00044149616973005EA153FF0049A069B0C9C -:106BB000980E99FEB0EAF030080A99FEB0EB20BBBF -:106BC0001B049A069B0C980E99FEB0EB1930080036 -:106BD000BCA6001302F1EC5604015E000080010126 -:106BE0005F000100001EC3010D02F1EC560300001E -:106BF0000001000A99FEB0EB15BB08FEB0EC640082 -:106C0000980299FEB0EC23404CB91B402B405C1815 -:106C10000B404CE0A0199818935C7C202CFE93FE4E -:106C2000EECF2A8001B0DC800138FE80013932804D -:106C30000138A4800138A8800134C48001352C803B -:106C40000137D08001375680019250EBCD40C018FB -:106C50009BE06C1AF4EA1C0000300A994AE06E19B5 -:106C60006CEA1E000030599D39990A991A992A999F -:106C70003A30083009F8E90014F8E9001CF8E90096 -:106C800024F8E9002CF8E90034F8E9003CF94A005E -:106C900044F94A00481C9A2E4A9D4A1C9A2E4A14CE -:106CA0009632D7AD282017CFE18D08BD199D2876E3 -:106CB00028EE1880007619EE198000760A189B2FAE -:106CC000CBFEB0E3C9E3CF90C00000EBCD40FE1691 -:106CD00091E066196CEA160000780B8D0B781BEEBC -:106CE0001B80008D1B782CEE1C80008D2C31EA0C53 -:106CF0009B6C4C00DA0F001302F1EC5604015F00AC -:106D000000800101600001000081A8010D02F1EC8A -:106D100056030000000100FEB0E8D06C39129A2042 -:106D20001A6C4CE0671AF4EA1700006E4B143BC271 -:106D30003431EA2FFB5C8BFEB0E8E6FEB0EC22EECD -:106D4000EB002C31EA6E4B2FFB5C8B6C4CFEB0E8F9 -:106D5000F9FEB0EC17EEEB003431EA6E4B2FFB5C22 -:106D60008B6C4CFEB0E90CFEB0EC0CEEEB003C6E14 -:106D7000462FF6C6B831EAC1F1F7D9B010FEB0E837 -:106D8000C3FEB0EBFFEEEB002C31EA6C3B5C8B6C8E -:106D90004CFEB0E8D7FEB0EBF5EEEB003431EA6C18 -:106DA0003B5C8B6C4CFEB0E8EBFEB0EBEBEEEB002B -:106DB0003C6C36C4B8F7D9B010FEB0E8998D5C31A0 -:106DC000EA300B6C4CFEB0E89318958D656C546AF4 -:106DD0000CFEB0EBD714921693680CFEB0EBD214F5 -:106DE000981699EEEA002CFEB0E9FA04980699FE8E -:106DF000B0EA2AEEEB002C6A1CFEB0EBC31492162C -:106E000093681CFEB0EBBE14981699EEEA0034FEAF -:106E1000B0E9E60498069900923F001302F1EC569F -:106E2000040160000080010161000100003D1901C2 -:106E30000D02F1EC56030000000100FEB0EA16EE70 -:106E4000EB00346A2CFEB0EBAF14921693682CFE64 -:106E5000B0EBAA14981699EEEA003CFEB0E9D20411 -:106E6000980699FEB0EA02EEEB003C6C360C9CFEF4 -:106E7000B0EBFF14981699EEEA002CFEB0EB481424 -:106E8000921693EEE300140C9CFEB0EBF2149816ED -:106E900099EEEA0034FEB0EB3B14941695EEE50053 -:106EA000240C9CFEB0EBE514981699EEEA003CFE2B -:106EB000B0EB2EEEEB001CFEB0D9B6189810960879 -:106EC0009A0A9BFEB0D9B018991295049A069BFEB7 -:106ED000B0D9AA0C980A99189A0E9B2F4B0E9C2F8A -:106EE0008CFEB0E2DD6E4C2FFC8F4C300A300BEE86 -:106EF000EB0014EEEB0024EEEB001C6E0B6E2CC3CB -:106F00002C1896EF4600446E1B6E3CC2CCEF4C0032 -:106F1000482D86E0460051C0522D8CE04C0051C0F7 -:106F200053301CA28CE3CF90FE300CA28CE3CF80B8 -:106F3000FED703800131A0800131EC0061E5001330 -:106F400002F1EC56040161000080010162000100C1 -:106F500000A8D2010D02F1EC5603000000010080F0 -:106F600001322880013264800131D4800138688088 -:106F70000134C48001352C80013932800137D08042 -:106F80000114E880012760F80B010AE04A00B5C04F -:106F900065162CFE3CFE985C3C5EFCFE5AFF4CC025 -:106FA00054FE3CFE98161C5EFC149C5EFC0000EB3C -:106FB000CD4080E067BED8EA1780010E9CFEB08607 -:106FC000C5311A307B300CFEB0F7F6582CC0812E3C -:106FD000C70E9CFEB086BA302CE3CD8080E3CF9004 -:106FE000800000EBCD4080E067BEB8EA1780010E5C -:106FF0009CFEB086AB311A307B301CFEB0F7DC58FB -:107000003CC0812EC70E9CFEB086A0303CE3CD80F4 -:1070100080E3CF9080D70380015254EBCD40C02055 -:107020002DFEB085771896E067C118EA178001AF8A -:107030000ABB1BE06B28FCEA1B0000761B2B0B1A1B -:107040009A1498308C173910C9201CCFD19AB99A4C -:10705000AA9A9B9A8CC33CE04C2711C125301C0096 -:107060001505001302F1EC560401620000800101D5 -:1070700063000100001769010D02F1EC56030000E6 -:10708000000100ED6C00C52BD60D8C581CC22136BA -:107090004BE06C00FFFEB08A452F870E9CFEB08649 -:1070A00067C188C174ED3C00C5581CC131300CED7E -:1070B0006C00C52BD60D8C580CC0C1E0A0285E30EA -:1070C0000BF93C0082FEB08A2D2F870E9CFEB08605 -:1070D0004F2FEDE3CF90C080006DB08000779CD43F -:1070E0003118961695129430073003089CFEB0D9DB -:1070F000671892089CFEB0D963049BFEB0D7801835 -:10710000920A9CFEB0D95C18950C9CFEB0D9580A26 -:107110009BFEB0D775049BFEB0D7E618965854C7AF -:1071200065E0673334EA173F330E9BFEB0D8F6C1F3 -:10713000F30C9C0E9BFEB0D8E5C183E06B6666EA5B -:107140001B3FE60C9CFEB0D8E9C102E06B3333EA8A -:107150001BBF330C9CFEB0D6FDE06BBA2EEA1B3F82 -:1071600068FEB0D74D1893C038FC133F80089CFED2 -:10717000B0D926FEB0EA3C149416953008E0691C9C -:10718000ACEA19002321001302F1EC56040163005C -:107190000080010164000100000341010D02F1ECD7 -:1071A000560300000001003FF8FEB0ECDF14961615 -:1071B00097069CFEB0EA2E14901691FC188000E011 -:1071C00069353FEA193FF0089A0A9BFEB0ECCEFC05 -:1071D00018A000E0697CEDEA193FF1FEB0E99100EA -:1071E000980299FEB0E98D14901691FC1C3F800620 -:1071F0009BFEB0D653FEB0EA0D14941695FC1A40CF -:1072000000E06BA92AEA1B3F430C980E99FEB0E9F7 -:107210007808980A99FEB0E974FEB0EA46FEB0EA32 -:107220005E00980299FEB0E857FEB0EA3E18970E4D -:107230009CD832800113608001157C8001159480F8 -:107240000111CC800112788001163880013DC08088 -:107250000110F08001386880013756800139328092 -:1072600001352C800138FEEBCD4080E06CC054EA43 -:107270001C8001FEB0858EE06728FCEA170000E064 -:10728000A027888F0CE0A0278B8F1C6E0CE06B6210 -:1072900050EA1B8001F94B0228E06B6284EA1B80F4 -:1072A00001F94B022CE06B00B6D2001302F1EC5650 -:1072B0000401640000800101650001000069F9011A -:1072C0000D02F1EC5603000000010062BCEA1B80D5 -:1072D00001F94B0230E06BA2FCEA1B8001F94B0282 -:1072E00034E06BA33CEA1B8001F94B0238E3CF90FA -:1072F00080D70380006FE88001B3E88001B3F4EB2E -:10730000CD40FC189716961495E06C3F20EA1C00BF -:1073100000F807032430033022E93C000E580CC06B -:1073200031E3CF80FC099C580CC1B1F7D5B00808F7 -:107330009C68CAF01A0000C14068BC781C5D1C182B -:10734000935C53C061049CFE32FF015C5CCF6158CA -:1073500003CE80F7D5B008089C68CA741A5D1AF588 -:10736000D5B008F7D6B008089C68C972495D195CA9 -:1073700053C140099C580CC111F7D5B008089C684E -:10738000CA742A5D1AC04068BC782C5D1CF7D5B061 -:1073900008089C68CA743A5D1AF9D7B008C97CE33A -:1073A000CF90FCEBCD40FC189716961495E06C3FFF -:1073B00020EA1C0000F807032430033022E93C00D7 -:1073C0000E580CC031E3CF80FC099C00B958001363 -:1073D00002F1EC5604016500008001016600010025 -:1073E00000FC32010D02F1EC5603000000010058D0 -:1073F0001CC1A1F7D5B008089C68CA742A5D1AC0E0 -:10740000D068BC782C5D1C1893E60C1518C061047C -:107410009CFE32FF015C5CCF51F7D5B008089C6838 -:10742000CA743A5D1AF5D5B008F7D6B008089C685A -:10743000C972595D195C53C150099C581CC125F78C -:10744000D5B008089C68CAF01A0000C0B068BC78C3 -:107450001C5D1CCCB0F7D5B008089C68CA741A5DD6 -:107460001AF9D7B008C45CE3CF90FCD42118971662 -:10747000961495E06C3F20EA1C0000F8070324E90D -:107480003C000E580CC021D82AF5D5B008E80500FC -:107490000C2EDCF92B0000089C68C972595D19F5A7 -:1074A000D5B008F7D6B008089C68C972495D19F9CB -:1074B000D7B008C1ECDA2A5C5C586CF9BC02061E35 -:1074C0000C19EC180F0A0E12161C22280030AC5EA4 -:1074D000FC314C5EFC33CC5EFCE06C00B45EFCE046 -:1074E0006C03C05EFCE06C27105EFC5EFD000000DB -:1074F000F553001302F1EC5604016600008001010F -:1075000067000100004389010D02F1EC5603000001 -:10751000000100EBCD40E030673FF6300CC148146D -:107520009B120BF72800115808C0955C670E38C0F5 -:1075300064F72700112EDBF72600002FF95C69584D -:1075400029CEF52FFC5C6C58ACC094E06B3F20EA70 -:107550001B0000F60C032A3009CF3BF9D7B008CB4B -:10756000EFE06527B8EA1500006A0BF75C006AF7E0 -:1075700067006CF766006DF71A006EF80A1900C212 -:1075800010F80A1510C090F71A0066580AC171F772 -:107590001A006E580AC131300AC0783009F60A0064 -:1075A0001828E8B0092FFA5C6A586ACF85F75C00A2 -:1075B0006E290BB687FEB083A1C048301CE0A02521 -:1075C000FBE0A02605C1216A0CF91B006E581BC008 -:1075D000D529AC988C580CC091FEB0BB0BE06CC2A6 -:1075E00058EA1C8001FEB0840BE3CF90E0D7038003 -:1075F000006EE48001B3A08001B3B88000DDDC80C0 -:10760000006FE8E1BC0000D3035EFCB18CF9DCC084 -:1076100001EC1C003379001302F1EC560401670001 -:10762000008001016800010000D462010D02F1EC4C -:107630005603000000010000015EFCD401CF9FC092 -:1076400020D503D80A0000D401201CC060201CC033 -:1076500070201CC080D80AE0A01914D80AE0A01934 -:107660002FD80AE0A0194AD80AD70380019A488087 -:10767000019A8480019AC0201CC080201CC0C020B8 -:107680001CC0F0201C5E0F5EFDFE7C1814780CF907 -:10769000DCC0015EFC486C780CF9DCC0015EFC4883 -:1076A0004C780CF9DCC0015EFCD703FFFF1864FFC7 -:1076B000FF1850EBCD40801897F9D7C008CDDFCF29 -:1076C000D0E3CF80800000300B990B5EFD00007886 -:1076D0000AE01AE0FFF5EB108B990B5EFD000078D5 -:1076E0000AE21AFFFD990A582B5E3D780AA1BA9961 -:1076F0000A780A201BAF7BE61BFFFF144B990B5E39 -:10770000FD0000780CA1ACFE7A1868F40B092C5E21 -:10771000FD0000300BFE7A1868F40C092B5EFDEBBF -:10772000CD40E0189616951497300BCCEF0A9B0CC1 -:107730009CCCFF0E9B0C9C00B775001302F1EC561D -:107740000401680000800101690001000094D90172 -:107750000D02F1EC56030000000100CD4F362C8DD8 -:107760001CE06CB400EA1C04C48D2CE46C00048D95 -:107770003C300C8D4CE3CF80E00000FE7C18147888 -:107780000CA99CF9DCC0015EFC0000D401581CC0AF -:1077900060584CC0C0589CC120D80A301CC7FFC1DB -:1077A00051301CC64F301CC98FD80A303CC77FC02F -:1077B000D1303CC5CF303CC90FD80A302CC6FFC0F1 -:1077C00051302CC54F302CC88FD80AEBCD40E01873 -:1077D00097300BCAAFC3BF3246EA16AA004B5B977D -:1077E00006301B4B4A950BC3CFFE7518146A0CED7F -:1077F000BC000ECFB2C2BF32CBEA1BAA004ADA9558 -:107800000B6E3B497A950BC2CF6A0CEDBC000ECFD4 -:10781000D2C1DF328BEA1BAA004A6A950B6E2B4954 -:107820001A950BC1EF6A0CEDBC000ECFD2C0FF332E -:107830000BEA1BAA0049FA950B6E4B48BA950BC18F -:107840000F6A0CEDBC000ECFD2C01F499B97066E8D -:107850001BA1AB498A950BC04FE3CF00BD0E0013AF -:1078600002F1EC5604016900008001016A00010088 -:10787000000112010D02F1EC56030000000100802E -:10788000E0D703FFFF182CFFFF1828FFFF1830EB8D -:10789000CD40C0FE7618146C0CEDBC000ECFB2CEFD -:1078A0008E3247EA17AA0048BB9707301B48BA95A3 -:1078B0000BCE9E6C0CEDBC000ECFD2CDAE486B97BC -:1078C00007300B485A950BCDEE300CC48FE3CF80B8 -:1078D000C0D703FFFF1818FFFF1824EBCD4080200E -:1078E0005D1897C5EFC1115807C091301CC61FE045 -:1078F0006904C4301A301B1A9CC37F0E9B1A9CC7A4 -:107900008F0E9CC4EFCFE02FBDE3CF80800000EB53 -:10791000CD40E018961697E06510CCEA1500006A95 -:10792000DC2FFC8BDC0C9CC1ECC0800C9CCEBCC062 -:10793000506ACC2FFC8BCCC038300C8BCC6ADC5816 -:10794000FCC0D46ACC58BCC065301CAE8C302CE373 -:10795000CD80E0300CAE8CE3CF90E0303CE3CD80C6 -:10796000E00000D421E0661104EA160000780B8DD7 -:107970000B781BEE1B80008D1B782CEE1C8000000A -:107980005B4E001302F1EC5604016A000080010115 -:107990006B00010000BEA9010D02F1EC56030000CE -:1079A0000001008D2C30AA0C9B6C4CFEB0E34C6C9B -:1079B00039129A201A6C4CE06710CCEA1700006E5E -:1079C0005B143BC1A430AA2FFB5C8BFEB0E3628F3B -:1079D0009C30AA6E5B2FFB5C8B6C4CFEB0E3788F07 -:1079E000AC30AA6E5B2FFB5C8B6C4CFEB0E38E8FD1 -:1079F000BC6E542FF4C3E830AAC161F7D9B010FEB1 -:107A0000B0E3488F9C30AA6C3B5C8B6C4CFEB0E3BF -:107A10005F8FAC30AA6C3B5C8B6C4CFEB0E3768F16 -:107A2000BC6C34C278F7D9B010FEB0E3278D5C305F -:107A3000AA300B6C4CFEB0E32118958D656C546E2A -:107A40009C680BFEB0D2A86A0BFEB0D3138F9C6E5D -:107A5000AC681BFEB0D2A06A1BFEB0D30B8FAC6E1D -:107A6000BC682BFEB0D2986A2BFEB0D3038FBC6CDF -:107A700034089CFEB0D534189B6E9CFEB0D3C4185D -:107A8000968F66089CFEB0D52B189B6EACFEB0D3CB -:107A9000BB18958F85089CFEB0D522189B6EBCFE46 -:107AA000B0D3B200FD2A001302F1EC5604016B00C2 -:107AB000008001016C00010000AA81010D02F1ECBF -:107AC0005603000000010018988F780A990C9A0E4E -:107AD0009B2F0B0E9C2F4CFEB0DDA86E5C2FFC8FF5 -:107AE0005C300C8F6C8F8C8F7C6E3C580CC045FECC -:107AF000B0D508C0485C3CFEB0D504FC1641C80CAB -:107B00009BFEB0D4ADC0F26E4C580CC045FEB0D454 -:107B1000F9C0485C3CFEB0D4F50C9BFEB0D4A0C0CC -:107B200022DA2AD82AD703800131A0800131EC80E3 -:107B300001322880013264800131D4800111CC806F -:107B40000113608001276080011638EBCD40FC18DE -:107B5000953004E06310CCEA1300006607300B0E8A -:107B60009CE0A02253C131661C300BE0A0224EC025 -:107B7000E1662C300BE0A02249C0916A0C870C6AA8 -:107B80001C871C6A2C872CE3CF80FC6A0C0E9BFEA2 -:107B9000B0D21418976A1C661BFEB0D20F18926AF6 -:107BA0002C662BFEB0D20A1896BFD70E9CFC173E4F -:107BB000800E9BFEB0D454C0E2BFD2049C0E9BFE4C -:107BC000B0D44EC082BFD600964D001302F1EC56E1 -:107BD00004016C00008001016D00010000C039014A -:107BE0000D02F1EC560300000001000C9C0E9BFE00 -:107BF000B0D448C02230146A0C870C6A1C871C6AF7 -:107C00002C872C089C5C5CE3CD80FC8001B140801B -:107C10000110F080011594D421E0691B40EA19009D -:107C200000129C2A0C300A300B189E30A8BD2A2066 -:107C300018CFE19D0A129CFE3CFF4CB91B992A12F9 -:107C40009CFE3CFF00B91BF8EB0008F8EB00109914 -:107C50006A129CFE3CFEE4B91BF8EB0008F8EB004E -:107C600010996A3008F3480138E06E03E8129BFE71 -:107C70003BFEC4E06C03E83006169A580CC0402066 -:107C80001C14C6CFE1129CFE3CFADC300A1897584F -:107C90000EC040201E0ECACFE1F348090CF348097C -:107CA00010F3480914F3480918F348091CF348096C -:107CB00020F3480924F3480928F348092C300EF32F -:107CC0004E0930F34E0934F34E09383015F34509A7 -:107CD0003CF34E0940F34E09443FFCF34C0948F392 -:107CE0004C094CF34E0950F348095400C498001352 -:107CF00002F1EC5604016D00008001016E000100EC -:107D00000055F2010D02F1EC56030000000100F3F2 -:107D1000480958F348095CF3480960F3480964F3DB -:107D2000480968F348096C129CFE3CF690300BB988 -:107D30001BF8EB0008F8EB0010996AF348098C1265 -:107D40009CFE3CF670B91BF8EB0008F8EB0010F84D -:107D5000EB0018B31BF2EB0008F2EB0010F2EB00A3 -:107D600018F2EB0020E06C2710F35C0014F35C00C9 -:107D700016B26EB27E930E129CFE3CFF40B91B9968 -:107D80002AFC1C4335F34C00C4FC1C4290F34C000D -:107D9000C03FFCF35C00C8F34E09B0F35E00F0F3A3 -:107DA0005E00F2F35E00F4F35E00F6129CFE3CF619 -:107DB0004CB91BF8EB0008F8EB0010F8EB0018F8D2 -:107DC000EB0020F8EB0028F8EB003099EAF34809C3 -:107DD000F0F34809F8F35E00F8F34E09F4F35E009F -:107DE000FAF35E00FCF3480A00F34809FCF34E0A7C -:107DF00004129BFE3BF5B4129C1694305AB907A9A5 -:107E000026201ACFD1129CFE3CF5B4F34C0A080090 -:107E10009A4A001302F1EC5604016E000080010141 -:107E20006F00010000EA49010D02F1EC5603000069 -:107E3000000100F3480A0CF3480A10E06725B4EA91 -:107E40001700008F188F288F388F48F34E0A20F3C1 -:107E50004E0A1CF34E0A2CF34E0A28F34E0A24F362 -:107E6000450A38F3450A34F3450A30F3480A44F327 -:107E7000480A40F3480A3C129C2D8C300A300BB95A -:107E80001BF8EB0008F8EB0010F8EB0018F8EB001B -:107E9000208F5EF3480A14F3480A18129CFE3CFF38 -:107EA00034B91B992A129CFE3CFF28B91B992A124F -:107EB0009C2B0CB91BF8EB0008F3480A488F7ED8BE -:107EC0002A0000EBCD4080203DE0671B40EA170010 -:107ED000000E9CFE3CFF401A9BB908B71978289702 -:107EE00028CBFE1A9CFE37FF40B90AAF1B782A8FB9 -:107EF0002A2FDDE3CF8080D401308A300B300CFE96 -:107F0000B0F144582CC031302CD802300CE06B2C2E -:107F10007CEA1B0000B68CB61CDA0A300CE06B2C35 -:107F20007CEA1B0000B68C5EFF0000EBCD40C02059 -:107F30001D301700925F001302F1EC5604016F0030 -:107F4000008001017000010000FA21010D02F1EC36 -:107F500056030000000100300CBA9CBA8CE0662C7D -:107F60007CEA160000ED2C0000F80B1518C0F1306B -:107F70001CAC8C300CAC2CE06C2C74EA1C0000782F -:107F80000CFEB0F797E0A00EA5C458581CC2A18CF7 -:107F90001C2FFCAC1CFACBFFFFE06C2C74EA1C001D -:107FA00000780CFEB0ED66C150308A300B301CFEFC -:107FB000B0F0FE583CC0213037308A309B300CFE88 -:107FC000B0F0F6582C302CC280AC8CE0A01038C237 -:107FD000288C1CE04C0096C1E5305CAC8CC8FCC120 -:107FE000A8583CC181584CC1608C2C2FFCAC2C8C07 -:107FF0002CE04C00FBCF241A9BE06C2C74EA1C0094 -:1080000000780CFEB0F796C060304CAC8C301CC6CB -:108010004CC75C0E9C5C6C2FFDE3CD80C0D7038009 -:10802000015F5880018D7880014B18800190E480B9 -:10803000015FD8EBCD4080E0672C74EA170000E0C8 -:10804000A021808F1CE0A021838F0C6E1CE06B6F41 -:10805000C4EA1B8001F94B00B969001302F1EC5628 -:1080600004017000008001017100010000EE9C011C -:108070000D02F1EC560300000001000108E06B6FF7 -:10808000E8EA1B8001F94B010CE06B6FF8EA1B80FA -:1080900001F94B0110E06B7140EA1B8001F94B01C3 -:1080A00014E06B7218EA1B8001F94B0118E3CF90C2 -:1080B00080D7038001B3E88001B3F4D401300BE032 -:1080C0006A2C74EA1A0000741AF53A0101580AC0C1 -:1080D00021D80A581CC031C0AC189B169C5C6CD8C7 -:1080E000020000D401300CC0ACDA0AE06B2C82EA4A -:1080F0001B0000F72C00005EFC0000E06B2C82EA05 -:108100001B0000B68C5EFDD401308A300B300CFEB3 -:10811000B0F060582CC031302CD802DA0A0000D4FC -:1081200001E06C2C7CEA1C0000300BB82BB81B3033 -:108130008A301CFEB0F04EDA0A0000EBCD40C030B1 -:1081400017E0662C7CEA160000ED2C0000582CC1CC -:10815000A1308A309B301CFEB0F03C583CC021302E -:1081600037CD3F582CC041302CE3CD80C0583CC0A7 -:10817000213037303CAC8CE06CC2F400C0CC001332 -:1081800002F1EC560401710000800101720001004F -:10819000007B57010D02F1EC56030000000100EADC -:1081A0001C8001FEB07EF20E9C5C6CE3CD80C08032 -:1081B00001525480006FE8D4013019178AF40A1074 -:1081C00068F80A0B09178AF40A1068180AB499307B -:1081D0008A1788F00810681808B0AA178AF40A10DD -:1081E00068140CB8C9178C2FFCB68CC8EFD80AD409 -:1081F00001C0FC300CC098300BE06A2D12EA1A0066 -:1082000000F40C0B0B2FFC5C6C582CCF65D80A309B -:108210000BE06C2D10EA1C0000B80B300AC128E0FE -:10822000682C98EA180000F40C10061808F20C10DC -:10823000061808B0CB2FF95C695819CF252FFA5CC6 -:108240008A594A5E4D3009CF8B0000E06B2C98EACA -:108250001B0000F80C1006F60C040C5EFC0000E09D -:108260006B2C98EA1B0000F80C1006180B961C5E8D -:10827000FC0000EBCD4080201D3FF7189B5C5B208D -:108280001BC04020BBC040C0583007C0A83017C03A -:1082900088500CE06CC0A8EA1C8001FEB07E76001D -:1082A000A3DB001302F1EC5604017200008001010F -:1082B0007300010000C4EC010D02F1EC5603000054 -:1082C0000001000E9C5C6C2FFDE3CD80800000EB74 -:1082D000CD40E0201D18973016CDFF18950E9C5C00 -:1082E0005C201CC04020BCC040C058CB8CC0B8CA69 -:1082F0002FC0985007E06CC088EA1C8001FEB07E59 -:108300005730065805C085300CE06B2D12EA1B0073 -:1083100000F6050B0C0C9C5C6C2FFDE3CD80E0EBB4 -:10832000CD4080201D3FF7586CC0313007C08850C9 -:108330000CE06CC158EA1C8001FEB07E390E9C5CDA -:108340006C2FFDE3CD808080006FE8EBCD4080E0B6 -:108350006B2D10EA1B0000968A149C2FFC595CC000 -:1083600035E3CF80803009C158F2081006E06E2C4A -:1083700098EA1E0000F40C1006180E100EFACCFF3E -:10838000F818083067112C1CBC2027CFD12FF95CBE -:10839000695819CEB5968C2FFCB60CE3CF9080E0CF -:1083A0006C2D10EA1C0000988C5EFCEBCD408030F8 -:1083B00007CF7F594CC02530170E9C5C6CE3CD80F5 -:1083C000800000008FA3001302F1EC56040173003B -:1083D000008001017400010000D0C4010D02F1EC25 -:1083E00056030000000100EBCD40C0232D302BBA16 -:1083F0008B301BBA9B306BBAABE06B2D10EA1B00C5 -:1084000000968A1499F20B1408BABBBAC9305B30D3 -:1084100008C278E06E2C98EA1E0000F00910061CD5 -:1084200009920E5C7EEFDEC010A9471A965C8BECB9 -:108430000B0B072FFB1A975C8BEE0B0B0E2FFB928F -:10844000195C79FDD9C010A94E5C8BEE0B0B0E2F79 -:10845000FB1A9E5C8BFC0B0B092FFB2FF85C68143E -:1084600038CD955C8B1A99169A189EC050133820F7 -:108470001A1CC8CFD1169C2CEDE3CD80C00000E0C3 -:108480006C00C0EA1C0000300BB82BB88BB89B30D6 -:108490001BB8AB5EFF0000D431203D300CFB6C00FC -:1084A0000840DCFEB0E1D614961697FC153FE0407C -:1084B000CCFEB0E1CFBFDB30080A99FEB0E1EAC1E3 -:1084C000B20C9A0E9BBFDB30080A99FEB0E1E2C104 -:1084D0003240ECFEB0E1BEBFDB30080A99FEB0E1ED -:1084E000D9C0A2300CE06B005FE9001302F1EC563A -:1084F00004017400008001017500010000BA7C01D4 -:108500000D02F1EC560300000001004684EA1B0056 -:1085100000970C971C972CCE38FC13404EE064C19A -:10852000E6EA141A63E065A5DCEA15404C40CCFE8F -:10853000B0E1A208980A99FEB0E11530080699FE4C -:10854000B0E1113008E0694000EA19408FFEB0E167 -:108550004714901691E06C4684EA1C0000780CFEEB -:10856000B0E18A00980299FEB0DFE8FEB0CFC418EF -:1085700091E06C4684EA1C000099010C9A0E9B085D -:10858000980A99FEB0E0EF30080699FEB0E0EB30B3 -:1085900008E0694000EA19408FFEB0E12114961608 -:1085A00097E06C4684EA1C0000781CFEB0E1640C85 -:1085B000980E99FEB0DFC2FEB0CF9E1896E06C46D2 -:1085C00084EA1C0000991640ECFEB0E15508980AB8 -:1085D00099FEB0E0C830080699FEB0E0C43008E06B -:1085E000694000EA19408FFEB0E0FA14941695E055 -:1085F0006C4684EA1C0000782CFEB0E13D08980A25 -:1086000099FEB0DF9BFEB0CF7718970013B0001330 -:1086100002F1EC56040175000080010176000100B2 -:10862000002FB7010D02F1EC56030000000100E03D -:108630006C4684EA1C00009927029CFEB0E12E14CF -:10864000941695BFD50C9CFEB0E1281490169100AD -:10865000920293BFD30E9CFEB0E12014961697BFF2 -:10866000DBBB1B089A0A9B04980699FEB0DF78BB17 -:1086700008FEB0DF75FEB0CF51301BEA1B42AAFEE8 -:10868000B0CF96C313BFD73018FC1940440C9A0ED4 -:108690009BFEB0E121C283BFD13018FC19403400E9 -:1086A0009A029BFEB0E118C1F3FEB07B9BFEB07F47 -:1086B000575F1BE06C4684EA1C0000780C5C5BC0D2 -:1086C000A0FC1BC170FEB0CF7FC0E2301CFB6C0071 -:1086D00008C0A8301BEA1B4170FEB0CF69C0433010 -:1086E0002CFB6C0008FB3C0008580CC090300CE0E0 -:1086F0006B4684EA1B0000970C971C972CFB3C00F0 -:10870000082FDDD832D703800138A8800137568082 -:108710000137D0800138688001352C800114E88051 -:108720000138A480006DB08000752C800115940084 -:108730001895001302F1EC56040176000080010147 -:108740007700010000900C010D02F1EC56030000CF -:108750000001008001157CD401E06C0D08EA1C00CA -:108760000078295C59189A2EAA198B306CFEB07CBF -:10877000B9D802D401E06C0D08EA1C000078295C2D -:1087800059189A2E8A198B306CFEB07CABD802EB4C -:10879000CD40C0E0680D24EA180000119E3007C0EB -:1087A000282FF7F6071800C1825C57F8070709124F -:1087B0005E5C5E3089C0580C9E5C5EFE39FF015CD9 -:1087C000595819CEF5FC061501EDBE0007CF521120 -:1087D0008E0C5E5C5ECF3B143E5F0CE3CD80C0D45C -:1087E00001CBBFD8020000EBCD40E0202D18973020 -:1087F00055E0660D08EA160000300830691A9A0D37 -:108800008B306CFEB07CC8581CCF410A9CFE3500F2 -:10881000015C7CCEF01BAA302B1A9CCBAFC0701B26 -:10882000DA302BFACCFFFDCB4FC031300CC3D88CE3 -:108830002C2FFCAC2C1B9B1B8CF7EC108BE06C11D1 -:1088400017B93BAF4BE02B11945C8B6C3C160C8D35 -:108850003C1BCB00A297001302F1EC5604017700F9 -:1088600000800101780001000007E7010D02F1EC32 -:10887000560300000001001BBCF7EC108BE06C09F4 -:10888000C4B93BAF4B5C8B6C4C160C8D4CE06C3F11 -:1088900020EA1C0000786C2F1C198C580CCD908C91 -:1088A0002C6C3BF60C0C0A6C4BF60C0C08300C8D47 -:1088B0003C8D4CAC2CF9DAB010A94CAE8CAE9AF9C8 -:1088C000D8B010A94CAEACAEB8301C2FEDE3CD80C3 -:1088D000E00000EBCD4080201DE0670D08EA1700A6 -:1088E000006E295C590E9A2E6A0F8B306CFEB07C9C -:1088F0000B300830391A9A0F8B306CFEB07C5E5802 -:108900001CC1011BAA302B1A9CC55FC031300CC0A2 -:10891000981B9B0FAC186B0F9CF80B1800CF813085 -:108920001C2FFDE3CD8080D401E06C0D08EA1C0013 -:1089300000300B993B994BB82BC2FFD80200005E68 -:10894000FF0000EBCD40C0201D1897300CAE8CE02E -:10895000660D08EA1600006C295C590C9A2E6A0D07 -:108960008B306CFEB07BD0300830391A9A0D8B30CA -:108970006CFEB07C23581C008154001302F1EC56AD -:1089800004017800008001017900010000475C01CA -:108990000D02F1EC56030000000100C0A11BAA303B -:1089A0002B1A9CC1AFC031300CC038301CAE8C2F9C -:1089B000FDE3CD80C0D7038000708C80007140EB58 -:1089C000CD40FE18973002E0662614EA1600000D2E -:1089D0008C581CC051049C5C5CE3CD80FE0D9C58FF -:1089E0000CC5916C1C580CC101E0652608EA150005 -:1089F000006E0C8B0C6E1C8B1C6E2C8B2C2FC66C83 -:108A00000C2FFC8D0CCE8BE0652608EA1500006E5D -:108A10000C6A0BFEB0CBBCFEB0DF76BFDBFEB0CD88 -:108A2000B318936E1C6A1BFEB0CBB2FEB0DF6CBFF6 -:108A3000DBFEB0CDA918946E2C6A2BFEB0CBA8FE3D -:108A4000B0DF62BFDBFEB0CD9F1897E0616666EADB -:108A5000113FA6069C029BFEB0CDECC192089C0281 -:108A60009BFEB0CDE7C1420E9C029BFEB0CDE2C0A2 -:108A7000F26C1C2FFC8D1C6C1C595CCAD5300C8B05 -:108A80000C8B1C8B2C8D1C301CAC9CCA5B300C8D51 -:108A90001CCA2B6C2C580CC3F16C1C007F63001398 -:108AA00002F1EC5604017900008001017A00010016 -:108AB00000D297010D02F1EC5603000000010058AE -:108AC0000CCA60E0652608EA1500006E0C6A0BFE11 -:108AD000B0CB70FEB0DF2ABFDBFEB0CD6718936E5F -:108AE0001C6A1BFEB0CB66FEB0DF20BFDBFEB0CD44 -:108AF0005D18946E2C6A2BFEB0CB5CFEB0DF16BF07 -:108B0000DBFEB0CD531897E0656667EA153FA60611 -:108B10009C0A9BFEB0CD94C0C2089C0A9BFEB0CDBF -:108B20008FC0720E9C0A9BFEB0CD8AFE93FF673009 -:108B30001C8D2C300C8D1CC61B581CFE91FF5F6CCD -:108B40001CE04C0096C0642FC66C0C2FFC8D0CC52D -:108B50005BFE90FF5E6C3CE04C0032C3E4E06526B7 -:108B600008EA1500006E0C6A0BFEB0CB23FEB0DEE7 -:108B7000DDBFDBFEB0CD1A18936E1C6A1BFEB0CBB6 -:108B800019FEB0DED3BFDBFEB0CD1018946E2C6A98 -:108B90002BFEB0CB0FFEB0DEC9BFDBFEB0CD06189A -:108BA000976C3C2FFC8D3CE0656667EA153FA60696 -:108BB0009C0A9BFEB0CD44C0C2089C0A9BFEB0003C -:108BC0002842001302F1EC5604017A0000800101F2 -:108BD0007B000100006D2C010D02F1EC560300003A -:108BE000000100CD3FC0720E9C0A9BFEB0CD3AFE44 -:108BF00093FF17301CAC8C3012C12B300C8D1C8DA8 -:108C00002C8D3CAC9CC0CB80011594800110F08071 -:108C1000013868800114E88001157CEBCD4080208C -:108C20001D338CBA8CE06725F4EA17000030191A5E -:108C30009A320B307CFEB07A9D8F0C370CBA8C3098 -:108C4000191A9A322B307CFEB07A948F0C300CBA01 -:108C50008C30191A9A324B307CFEB07A8B8F0CE034 -:108C60006C0080BA8C30191A9A320B307CFEB07AC4 -:108C7000818F0C2FFDE3CD80800000EBCD40802064 -:108C80001D338CBA8CE06725F8EA17000030191AFA -:108C90009A320B307CFEB07A6D8F0C370CBA8C3068 -:108CA000191A9A322B307CFEB07A648F0C300CBAD1 -:108CB0008C30191A9A324B307CFEB07A5B8F0C2FB5 -:108CC000FDE3CD80800000D401201DE06C0080BA5F -:108CD0008C30191A9A320B307CFEB07A4B2FFDD8AB -:108CE000020000003554001302F1EC5604017B0031 -:108CF000008001017C000100007904010D02F1EC0B -:108D000056030000000100D401201DE06C0080BA71 -:108D10008C30191A9A320B307CFEB07A3D2FFDD878 -:108D2000020000EBCD40FE203D18973001300CBA18 -:108D30008C3006301230133005C3A80A9C2D0CBAB3 -:108D40008C30191A9A320B307CFEB07A251891EECD -:108D500006000430083019089A2FFA323B307CFEA6 -:108D6000B07A7430083019089A321B307CFEB07A21 -:108D70006D2FE65C56EA0C1501EE0C000B178AA964 -:108D80006A179B140BFACAFFFC180AB40BE06A2599 -:108D9000E8EA1A0000140C982CF80B1900C02030D7 -:108DA000025C8B581BC02530032FF55C555835CC21 -:108DB000653006AEE6AEF65C525812C0405C5358C1 -:108DC00013C211E06725E8EA170000EF2C000058F5 -:108DD0006CC055029C2FDDE3CD80FE8E9C2FFCAE37 -:108DE0001C8E9C58ACCF75E06CC288EA1C8001FEDA -:108DF000B07980C7CFC55FEF2C00002FFCAE8CAEE2 -:108E000016CE9BE06725E800B7DD001302F1EC56B3 -:108E100004017C00008001017D0001000013BC0101 -:108E20000D02F1EC56030000000100EA170000FA01 -:108E3000CAFFFC0E9C2FCC1898306B153910C92036 -:108E40001BCFD1AE16AE86CD8BD7038000708C8041 -:108E500000714080006FE8E1BC0000D3035EFCB10C -:108E60008CF9DCC001EC1C00015EFCD401CF9FC07A -:108E700020D503D80A0000D401201CC060201CC0EB -:108E800070201CC080D80AE0A00E76D80AE0A00EA0 -:108E900091D80AE0A00EACD80AD70380019A488086 -:108EA000019A8480019AC0201CC080201CC0C02070 -:108EB0001CC0F0201C5E0F5EFDFE7C1814780CF9BF -:108EC000DCC0015EFC486C780CF9DCC0015EFC483B -:108ED0004C780CF9DCC0015EFCD703FFFF1864FF7F -:108EE000FF1850EBCD40801897F9D7C008CDDFCFE1 -:108EF000D0E3CF80800000E06C0D30EA1C0000F968 -:108F00002B00005C5BC060202BC070201BC0A05EEB -:108F1000FDE07CC1385EFCE06C5A00EA1C02625E37 -:108F2000FCE06C0E00EA1C07275EFC0051CB00132E -:108F300002F1EC5604017D00008001017E00010079 -:108F4000008677010D02F1EC56030000000100D409 -:108F500001CE5FA38CD802EBCD40C018961697C8FF -:108F6000EFFE7A1420F406002A7409320BEA1BAAD9 -:108F700000F606002BFE781458910B301BF60709FB -:108F80004B16499509C85FE3CF80C0EBCD40E03078 -:108F90000730063005580CC040201CA7BC18975855 -:108FA0000BC040201BA7BB1696580AC040201AA72A -:108FB000BA1495C64F304BEA1BAA00496A950BFEBE -:108FC0007B1404970730CBEA1BAA00950B486B97DC -:108FD00006310BEA1BAA00950B484B9705C59FE38A -:108FE000CF80E0FFFF140CFFFF1410EBCD40801882 -:108FF00097C45FFC1BAA00487A950BFE7B14009770 -:1090000007C47FE06C0D30EA1C0000B887E3CF8016 -:1090100080D703FFFF1458D401302A302B302CCBDB -:109020006FE06C0D30EA1C0000F92B00005C5B2047 -:109030002BC040201BC0B0C138300CFEB0F5B8C802 -:109040008FFEB0E3CF302CCD2FC0A8303CC27F00C4 -:109050006BDE001302F1EC5604017E00008001017A -:109060007F0001000039CC010D02F1EC5603000035 -:10907000000100303CC5BFC7EFFEB0E3C5303CCCBB -:109080008FC0FFC18FD80A80016A5C80014690EBD7 -:10909000CD40C0201DD553300CBA8CE0A01A36E06C -:1090A000800081E0672C8CEA170000FEB0773C8FCF -:1090B0001CE0A0186BFEB0A4E36E1CE0662C94EAE2 -:1090C000160000780B580BC0400D8BA1ABAC8B3059 -:1090D0001BFEB0782D6E1CFEB0779A6E1C783B5844 -:1090E0000BC0400D8BA1BBAC8B785B580BC0400D07 -:1090F0008BA3ABAC8B786B580BC0400D8BA3BBAC78 -:109100008B0D8B58FBC051355B2B0CB88BC0382BAB -:109110000CB88B300A301B301CFEB07B35FEB07AA9 -:10912000B1E0A017D7332B6E1CFEB079E56E1CFEA4 -:10913000B0792A6E1CFEB0794DFEB07A49FEB07A45 -:109140005FFE7C1580780C6E1CF93B0050E04B00F4 -:1091500055C211301BFEB07AC9301CBA8C300B6E70 -:109160001CFEB07AA3E0A01A01324BF96B008231E9 -:10917000CBF96B00A382001302F1EC5604017F00CF -:1091800000800101800001000084A7010D02F1ECC4 -:10919000560300000001000083300BF95B006E1BDA -:1091A0008B580BC120303BF96B007EF96B007F3090 -:1091B0004BF96B0080C098300CFEB07A77307CE0C1 -:1091C000A014DCCFDB300C2FFDE3CD80C0D70380B3 -:1091D00001B39480006DB08001B0148000C9088094 -:1091E000006FB880006E98800076108000750C804B -:1091F00001AF5C80007380800072108000725C8020 -:109200000074588000748880007574800075348004 -:1092100001B3F4EBCD40C0E0672C8CEA170000C42A -:10922000AF8F0CC078301AFEB07D8E307CE0A01479 -:10923000A56E1B6E0CF91A006E581ACF54300AFE38 -:10924000B07D826E1CFEB07C21FEB0515BC0D1307F -:1092500006C0282FF65C565836C0746E1CFEB07CD3 -:1092600015FEB0514FCF70300B6E1CFEB07A446EBD -:109270000C292C988C580CCDD1300CFEB07A1630BD -:109280007CE0A0147BCD6B80007BAC800078F0800C -:109290000023688000755C001057001302F1EC5643 -:1092A00004018000008001018100010000C8340138 -:1092B0000D02F1EC560300000001008000751080E3 -:1092C00001A9E0D401201D1A9CE06BC30BEA1B80AE -:1092D000013039173A18CA2019CFD130391A9A32C9 -:1092E0000B307CFEB077B2C031300CC068E06C004F -:1092F0009CEA1C0000780C2FFDD802D401201D1A16 -:109300009C300BB88BB89BB8AB30391A9A320B3003 -:109310007CFEB0779BC031300CC068E06C00A0EAE6 -:109320001C0000780C2FFDD8020000D401201D1A6B -:109330009CE06BC314EA1B80013039173A18CA202D -:1093400019CFD130391A9A320B307CFEB0777EC0FB -:1093500031300CC068E06C00A4EA1C0000780C2FCF -:10936000FDD802D401201D1A9CE06BC317EA1B80B4 -:10937000013039173A18CA2019CFD130391A9A3228 -:109380000B307CFEB07762C031300CC068E06C00FE -:10939000A8EA1C0000780C2FFDD8028000708CEB2E -:1093A000CD40FE202D18923011301330143007C1FB -:1093B000C80D8C0D9BAC8BAC9C0D8B003E730013C9 -:1093C00002F1EC56040181000080010182000100DD -:1093D000005DFF010D02F1EC56030000000100A941 -:1093E0006B0D9C160C1A9B0A0BB60CE06B25FCEA65 -:1093F0001B000016058A2BF60C1900C02030035CF8 -:109400008C581CC02530042FF75C575847C1A4EE78 -:10941000051501E405000630280C990E9A2F8A5C88 -:109420005A320B307CFEB0774F1891CD51E06CC0B2 -:10943000D8EA1C8001FEB076C9300C2FEDE3CD8058 -:10944000FE5C535813C0405C545814C211E06725A9 -:10945000FCEA170000EF2C0000586CC035029CCECF -:10946000EB8E9C2FFCAE1C8E9C58ACCF95E06CC054 -:10947000D8EA1C80012F8CFEB076A8C6AFC51FEFBE -:109480002C00002FFCAE8C300CAE1CCE9BE0672570 -:10949000FCEA1700001A9A0E9C2FCC1898308B15F6 -:1094A0003910C9201BCFD1300CAE1CAE8CCD8B80B7 -:1094B0000070E480006FE8D431202D1494169518C4 -:1094C00093E068CD57EA185E9EE0692614EA193FDA -:1094D000D1FEB0DAD9C223E0664CAAEA16E85800F9 -:1094E0007A45001302F1EC5604018200008001016C -:1094F0008300010000E244010D02F1EC560300007C -:10950000000100E067B67AEA173FFB089A0A9B0C55 -:10951000980E99FEB0D90EBB2B089A0A9B0C980E98 -:1095200099FEB0DA1C30083009EA19BFF0FEB0D954 -:1095300001BB09FEB0DA5014941695A1A33008308F -:1095400009EA19BE40089A0A9BFEB0DAB1C0A330FE -:10955000183009EA193E40089A0A9BFEB0DAA6C7FD -:10956000B3089A0A9B08980A99FEB0D9F81496167F -:1095700097E06839DEEA188F02E069C0C7EA193F50 -:1095800074FEB0D9ECE068AB8AEA188312E0690C8B -:1095900000EA193FC8FEB0D8CD0C980E99FEB0D99C -:1095A000DEE068D724EA1808E5E069D8B6EA193F92 -:1095B000F0FEB0D8BF0C980E99FEB0D9D0E0683458 -:1095C0000FEA180E58E0699558EA193FFDFEB0D829 -:1095D000B10C980E99FEB0D9C230083009EA193F93 -:1095E000F0FEB0D8A7BB1BE0685D84EA181357E013 -:1095F00069574BEA193FB00C9A0E9BFEB0D9AFE009 -:109600006893B20080F2001302F1EC56040183006B -:10961000008001018400010000F66C010D02F1ECF4 -:1096200056030000000100EA18194CE0695EEDEAFB -:10963000193FE4FEB0D8900C980E99FEB0D9A1E085 -:1096400068DEBEEA18B902E0694002EA193FF8FE96 -:10965000B0D882BB2B089A0A9B0C980E99FEB0D901 -:1096600090BB09FEB0D98D08980A99FEB0D874BB9A -:1096700008FEB0D9C314941695EDB30001C032EEC4 -:10968000158000F9D3C003C0D0E06BBD38EA1B8061 -:1096900001F60C023A08980A99FEB0D85D149416A7 -:1096A00095A583E80A1720EA0B1720C052EE158013 -:1096B00000089A0A9B2FEDD832D703800138A88082 -:1096C0000138A480013756800137D08001352CD471 -:1096D00001CC9CE0A0106EE0A01586E0A017B0E0E1 -:1096E00069437CEA190000129CFE3CFE7C300A3083 -:1096F0000B189E3088BD2A2018CFE19D0A129C2F9E -:109700004CB91BB84AB31BB24A129CFE3CFE38B996 -:109710001B992A129C2E8C189E32D8BD2A2018CF55 -:10972000E19D0A31EC2E89005174001302F1EC56D0 -:10973000040184000080010185000100009CD40127 -:109740000D02F1EC56030000000100B20CD80A80B3 -:1097500001AFBC8001B414D401E0A0103DD80A8050 -:1097600001A588D401E0A01775E0A01733D80A80BE -:1097700001B4048001B384D401E06C437CEA1C0092 -:1097800000E0A00563D80A80018FFCE06C437CEA0E -:109790001C0000189B2F4B189AB509B728150816FE -:1097A000A8300BB81B5EFDEBCD40801897FEB0D5FE -:1097B000418E8C2FFCAE0C8E8C8E1B163CC0358ED1 -:1097C0001CAE0CE3CF908080012FE4EBCD40C0E0D5 -:1097D0006C4554EA1C00007807E066437CEA1600FA -:1097E000000C9BFE3BFE380C9C2F4CCDEF31EA0C5D -:1097F0009BFE3BFE380C9C2E8CFEB0D5F9301B0C2A -:109800009CFE3CFE38FEB0D005EDB70001C08230B2 -:109810000B0C9CFE3CFE38FEB0CD6AC078301B0CB1 -:109820009CFE3CFE38FEB0CD63300BFE36FE7C0C59 -:109830009CC1BCE3CF80C0800131A0800125C480E1 -:109840000120A0E06C437CEA1C0000005545001399 -:1098500002F1EC5604018500008001018600010040 -:1098600000091F010D02F1EC56030000000100FE8B -:109870003CFE7C5EFC0000E06B437CEA1B0000F6D3 -:10988000FA0184188AF74A01845EFD780A144B991C -:109890000B5EFDE06C437CEA1C00002E8C5EFCE05D -:1098A0006B4550EA1B0000970C5EFDE06C4550EAEA -:1098B0001C0000300B780A950B780A951B780A95E6 -:1098C0002BE06B0400780A953B780A954B780A9553 -:1098D0005B301B780C2E8CB88B5EFDEBCD4080E0AE -:1098E00067BF58EA1780010E9CFEB074B730FA309B -:1098F0001B300CFEB0E5E8582CC0812F070E9CFEF3 -:10990000B074AC302CE3CD8080E3CF90800000EBCE -:10991000CD4080E067BFC8EA1780010E9CFEB0749E -:109920009D30FA301B301CFEB0E5CE583CC0812F74 -:10993000070E9CFEB07492303CE3CD8080E3CF9064 -:1099400080D70380015254D401201D300CBA8C1AE8 -:109950009CFEB06F55301CC5ACFB2C0000C49C2F86 -:10996000FDDA0A8000658CD401E06CC0C8EA1C00F6 -:109970000960001302F1EC56040186000080010129 -:109980008700010000B6A4010D02F1EC56030000AF -:109990000001008001FEB07473E0A01671E06B2B33 -:1099A000B4EA1B0000970CE06B866CEA1B8001F99F -:1099B0004B01E8E06B86A0EA1B8001F94B01ECE06B -:1099C0006B86D8EA1B8001F94B01F0E06B875CEAFB -:1099D0001B8001F94B01F4E06B87A8EA1B8001F9B9 -:1099E0004B01F8DA0AD70380006FE88001B3E8D4AE -:1099F00001E06C2BB4EA1C0000780CF93C01E15842 -:109A00000CC021D80AC0DCD8020000D401300CC13F -:109A10000CDA0AE06B2BB9EA1B0000B68C5EFDE0A5 -:109A20006B2BB8EA1B0000F72C00005EFC0000E086 -:109A30006B2BB8EA1B0000B68C5EFDD401189A307F -:109A40001C1789F2091068F4090B0C1789F2091028 -:109A5000681409B29C30FC1789F20910681409B225 -:109A6000ACE06C2BB9EA1C0000F9290000178CF857 -:109A70000C1068180AB4C9178C2FFCB68CCC7FD890 -:109A80000A0000EBCD40C01697E06B3F20EA1B00B8 -:109A900000F60C00BBFB001302F1EC56040187003A -:109AA000008001018800010000214F010D02F1EC4E -:109AB000560300000001000326AC8CE06BB844EABA -:109AC0001B80018DCB58ACF9BC020A1E0C19EC1896 -:109AD0000F0E22303E50649C7688AEC000303CEDC4 -:109AE0006C001030ACED6C000CFE3BFF3C8DCBC528 -:109AF00008303CED6C001030ACED6C000CC49830BC -:109B00003CED6C0010305CED6C000CC428303CED7A -:109B10006C0010305CED6C000C2C8B8DCBC398303E -:109B20004CED6C001030ACED6C000CFE3BFF588D22 -:109B3000CBC2F8301CED6C0010305CED6C000C29D1 -:109B40000B8DCBC268304CED6C0010305CED6C00BE -:109B50000C2ACB8DCBC1D8301CED6C0010305CEDE5 -:109B60006C000CFE3BFF748DCBC138303CED6C00BB -:109B700010305CED6C000C2E4B8DCBC0A8303CED52 -:109B80006C001030ACED6C000CFE3BFF208DCBED7B -:109B90003C000CED3B0010B73CA17CE0A0096E8DB1 -:109BA0002CED3C000C201CACDCED3C000C201CAC73 -:109BB000CC300CED6C000E00A9B3001302F1EC5692 -:109BC0000401880000800101890001000061F401A6 -:109BD0000D02F1EC56030000000100301BED6B009C -:109BE0000FED6C000DAC9CED5C00243FFBED6B00B9 -:109BF000263FFAED5A0028300AC148EC0900181433 -:109C0000082EB8B08C2FF95C695869CF85EC0A0032 -:109C100009F36C0021F36B00112ED9B28B2FFA5C83 -:109C20006A582AC0343009CF0B8DB7E3CF80C0808B -:109C3000019BC0EBCD40E0218DFACCFFF4FEB0E4F7 -:109C4000F3FACCFFC8E0A013DBE0672C60EA170052 -:109C500000FB1C0046AECCFACCFFF4780A500A7820 -:109C60001A501A782A502A0E9CFEB0C9F51896E0B0 -:109C7000652C71EA1500000B8C1836C1005826C0FF -:109C800071301CC62C301C2F87AE8CC0885816C073 -:109C900061301CC5AC302C2F87AE8CAA862E8DE38C -:109CA000CF90E0800153488001B12080011D78D41D -:109CB00001E0A01509E06B2C60EA1B0000973C3026 -:109CC0000A2F8BB68AE06B912CEA1B8001F94B01BD -:109CD000A8E06B9208EA1B8001F94B0062030013B5 -:109CE00002F1EC5604018900008001018A000100A4 -:109CF00000F43F010D02F1EC5603000000010001E9 -:109D0000ACE06B8958EA1B8001F94B01B0E06B8A2B -:109D10002CEA1B8001F94B01B4E06B8A78EA1B80C6 -:109D200001F94B01B8DA0A8001B3E8D401E06C2CE8 -:109D300060EA1C0000783CF93C01A1580CC021D815 -:109D40000AC0DCD8020000D401300CE06B2C60EAC1 -:109D50001B00002F8BB68CC0ACDA0AE06B2C70EACB -:109D60001B0000F72C00005EFC0000E06B2C70EA8A -:109D70001B0000B68C5EFDD401189A301C1789F2C6 -:109D8000091068F4090B0C1789F20910681409B25C -:109D90009C30DC1789F20910681409B2ACE06C2C15 -:109DA00060EA1C00002F8CF9290000178CF80C10B9 -:109DB00068180AB4C9178C2FFCB68CCC6FD80AEB84 -:109DC000CD40C020EDFACCFFF4FEB0E43FFACCFF6A -:109DD000E8780A500A781A501A782A502AFEB0F405 -:109DE000E91897E0662C4CEA1600000D8C0E3CC179 -:109DF000705817C0A1301CC6EC301CE06B2C400022 -:109E0000C874001302F1EC5604018A0000800101BD -:109E10008B000100004B84010D02F1EC56030000A1 -:109E2000000100EA1B0000B68CC0B85827C0913072 -:109E30001CC63C302CE06B2C40EA1B0000B68CACFE -:109E4000872F2DE3CF90C080015348800174B0EB81 -:109E5000CD4080E0672C40EA170000E0A014588F46 -:109E60002CE0A0145B8F1C300CAE8C6E2CE06BAD24 -:109E7000ACEA1B8001F94B0208E06BADCCEA1B8019 -:109E800001F94B020CE06B8AC0EA1B8001F94B021E -:109E900010E06B8B94EA1B8001F94B0214E06B8B92 -:109EA000E0EA1B8001F94B0218E3CF9080D70380D2 -:109EB00001B3E88001B3F4D401E06C2C40EA1C004B -:109EC00000782CF93C0201580CC021D80AC0DCD81B -:109ED000020000D401300CE06B2C40EA1B0000B6FD -:109EE0008CC0BCDA0A0000E06B2C4DEA1B0000F7C6 -:109EF0002C00005EFC0000E06B2C4DEA1B0000B65D -:109F00008C5EFDD401189A301C1789F2091068F490 -:109F1000090B0C1789F20910681409B29C310C174F -:109F200089F20900B80B001302F1EC5604018B0012 -:109F3000008001018C000100005FAC010D02F1EC1A -:109F40005603000000010010681409B2ACE06C2C4C -:109F500040EA1C0000F9290000178CF80C10681862 -:109F60000AB4C9178C2FFCB68CCC7FD80A0000EB42 -:109F7000CD4080201D300CBA8CE06728D4EA170051 -:109F8000001A9B6E1CFEB0B9CFC090301CC67CFB83 -:109F90002B0000AE8BEF2C0000AE9C2FFDE3CF908A -:109FA00080D7038000FFDCEBCD4080E06728D4EA57 -:109FB000170000E0A013BE8F2CE0A013C18F1C304F -:109FC0000CAE8C6E2CE06BAD70EA1B8001F94B007F -:109FD000E8E06BAD90EA1B8001F94B00ECE06B8C84 -:109FE00028EA1B8001F94B00F0E06B8CC8EA1B806B -:109FF00001F94B00F4E06B8D20EA1B8001F94B0066 -:10A00000F8E3CF9080D7038001B3E88001B3F4D4A4 -:10A0100001300BE06A28D4EA1A0000742AF53A00ED -:10A02000E1580AC021D80A5C6CC031C10C189B16DB -:10A030009C5C6CD8020000D401300CE06B28D4EAA0 -:10A040001B0000B68CC0BC005F2D001302F1EC5663 -:10A0500004018C00008001018D0001000035140115 -:10A060000D02F1EC56030000000100DA0A0000E0E6 -:10A070006B28E0EA1B0000F72C00005EFC0000E00B -:10A080006B28E0EA1B0000B68C5EFDD401189A3004 -:10A090001C1789F2091068F4090B0C1789F20910D2 -:10A0A000681409B29C307C1789F20910681409B24F -:10A0B000ACE06C28D4EA1C0000F9290000178CF8E9 -:10A0C0000C1068180AB4C9178C2FFCB68CCC7FE032 -:10A0D0006CC240EA1C8001FEB0713ED80AD70380F2 -:10A0E000006FE8D421E06708E8EA170000EF3C03BE -:10A0F000B2581CC021D82AE0654690EA1500000A33 -:10A100009C2B0CFEB0FC4C0A9C2B0CE0A0131830CE -:10A1100006EB66008CEB66008DFEB0FC47EB47005B -:10A12000E4EB4600EC0A9C288C300A300BB91BF893 -:10A13000EB0008994A0A9930ACB32A201CCFE10AF7 -:10A140009CFE3CFF6C189830A9B12A2019CFE1EB96 -:10A150004600F0300CC088F80B1035A36B0E0BB620 -:10A16000C6B6E62FFC583CCF8530140064EB0013D4 -:10A1700002F1EC5604018D00008001018E00010007 -:10A1800000A0DF010D02F1EC56030000000100EB1E -:10A19000440090301CC19CEF64038D301CFEB0FB6A -:10A1A0004DEF4603B4EF6603B0FEB0FB79EF6403F6 -:10A1B000B2DA2A800186308001B3D08001863C80EB -:10A1C0000184A88001850CEBCD4080189A3008C12D -:10A1D000A8F808002CF8FC0358F80E1035A36E16EA -:10A1E0000E301CBCCCF2F700F4F00C1035A36C1848 -:10A1F0000B17ECFCCBFFE0F60C0F8C1847F3470075 -:10A20000F42FF8E06B08E8EA1B0000F40C150516C3 -:10A210000CE0694690EA190000F93E03541C38CD61 -:10A2200095F93A0354F76A03B1F93C036CF36C00F7 -:10A2300068581AC044169CE3CD8080F36A000DF381 -:10A240004B00E4169CE3CD80800000E1BC0000D30D -:10A25000035EFCB18CF9DCC001EC1C00015EFCD497 -:10A2600001CF9FC020D503D80A0000EBCD40C030FD -:10A2700009C09878AE30171188EE0809470E8E99FC -:10A28000AE2FF91439C522F20810061608119E00E7 -:10A29000A738001302F1EC5604018E000080010182 -:10A2A0008F000100001F64010D02F1EC5603000055 -:10A2B000000100581EC0817857301E1186FC060927 -:10A2C0004E0E4EC078785E30171186EE0609470EA6 -:10A2D0008E995E11AE581EC0817867301E1186FCC3 -:10A2E00006094E0E4EC078786E30171186EE0609BC -:10A2F000470E8E996E11BE581EC0817877301E11A0 -:10A3000086FC06094E0E4EC078787E30171186EE18 -:10A310000609470E8E997E11CE581EC0817887306F -:10A320001E1186FC06094E0E4EC078788E3017112D -:10A3300086EE0609470E8E998E11DE581ECAD17818 -:10A34000A7301E1188FC08094E0E4ECACBE3CF8001 -:10A35000C00000301AF40B094A99CA5EFD000030B3 -:10A360001AF40B094A99DA5EFD0000301AF40B0961 -:10A370004A990A5EFD0000EBCD40C018961697C7BB -:10A380008F301BF607094B8D1B6C2BC7CFE3CF809B -:10A39000C00000EBCD40C018961697C6AF301BF634 -:10A3A00007094B8D4B6C3BC6EFE3CF80C00000EB41 -:10A3B000CD40F800E91C001302F1EC5604018F00B7 -:10A3C0000080010190000100000F0C010D02F1EC72 -:10A3D000560300000001001897E0664690EA160058 -:10A3E000006D7C580CC091E06C0400ED4C005CEDFD -:10A3F0004C0060ED4C00646D5CFEB0C2F518956DCC -:10A400008CFEB0C2F16DCBFEB0C124E06BF5C3EAA7 -:10A410001B411CFEB0C1920A9BFEB0C0C5FEB0C27B -:10A42000CB18946D6CFEB0C2DF18956D9CFEB0C267 -:10A43000DB6DDBFEB0C10EE06BF5C3EA1B411CFE19 -:10A44000B0C17C0A9BFEB0C0AFFEB0C2B518956D1E -:10A450004CFEB0C2C918936D7CFEB0C2C56DBBFE88 -:10A46000B0C0F8E06BF5C3EA1B411CFEB0C1660644 -:10A470009BFEB0C099FEB0C29F8E1BEE0B001BB6B8 -:10A480002C8E1CEE0C001CB8348E1CEE0C001CB87C -:10A49000458E1C2FFCAE1C8E1C59ECC03531DCAE39 -:10A4A0001CE3CF90F8D7038001160C80011278804E -:10A4B000011360800111CC800115DCEBCD40E03050 -:10A4C0000BC078F60C1035A36C1807AEC62FFBE056 -:10A4D0006708E8EA1700000081F5001302F1EC5666 -:10A4E000040190000080010191000100001BB101F6 -:10A4F0000D02F1EC560300000001003006583BCF7E -:10A5000045E0654690EA150000EB460090EF6603D3 -:10A51000B1FEB0FA01EB4600F4EF6603B2E3CF8080 -:10A52000E0D70380018518EBCD4080218D300C50A1 -:10A53000CC50BC30DA300BFEB0E08C582CC031303F -:10A540002CC5983017E06A2C60EA1A00009507FBCA -:10A550001C006E50CCFB3C006C50BC40BC581CC076 -:10A5600051E06C010050BCC1B840BC582CC051E057 -:10A570006C020050BCC14840BC583CC051E06C0467 -:10A580000050BCC0D840BC584CC051E06C080050D2 -:10A59000BCC06840BC585CC031310C50BCFACBFF29 -:10A5A000D4FACCFFD0FEB0C4E7E06C00B4BACC342F -:10A5B0006CBADCBAE7300CFB6C0034303CFB6C004E -:10A5C00035FACCFFC81A9B3249170A18AA2049CF7E -:10A5D000D130ACFB6C0036FB57005CFACCFFCC1AD8 -:10A5E0009B32C9190A16AA2049CFD1FEB0E0F2CA9F -:10A5F00080301C2E8DE3CD8080D70300A551001341 -:10A6000002F1EC560401910000800101920001006A -:10A61000008E7A010D02F1EC56030000000100806B -:10A6200001525480011B78D401216D301CFB6C0059 -:10A630002C303CFB6C002D30ACFB6C002E301CFB36 -:10A640005C0054FACCFFD41A9B32C9190A16AA200E -:10A6500049CFD1FEB0E0D0C031303CC048FEB0C5DB -:10A6600093301C2EADD802800153D480011D64D4D8 -:10A670002118961697E06507FF780CEBEC034C0A5F -:10A680003CC0B16C0CF9DCC014C0416C1C580CC04F -:10A6900030302CD822DA2A580CC0710C9CE0A00D66 -:10A6A0001D581CC025D82A5817C10518150A37C0CF -:10A6B000D36C0CA17C300AC042F06B0000C0483063 -:10A6C0000BEA1B7FF0AD1BDA2AF80B11000E3BC022 -:10A6D000A46C0BE41B800F1807F7E711478D073FA9 -:10A6E000FCD822300BEA1B80006C0A166A6C09F356 -:10A6F000D9C014B5A98D09201C1807300CEEC9FF6C -:10A70000CBE0490035C0438D0A8D1CD82A30095A48 -:10A7100017C0642E076C196C088D188D0C5C3700FF -:10A72000DBA4001302F1EC56040192000080010149 -:10A73000930001000031C1010D02F1EC560300004D -:10A74000000100C15058095F19EE0811206C1CF877 -:10A7500008094C18496C1CF8070A4E6C0CF80809DB -:10A760004C184E8D1E6C0CF8070A4C8D0C6C0C149A -:10A770004C8D0C301CEA1C80001839C0621639C0A0 -:10A78000C16C1CA19CC0926C1C2FFC8D1CC0516C18 -:10A790000C2FFC8D0CC0786C0C143CC0416C1C5808 -:10A7A0000CC9403FFCD8228001ACB8EBCD40C021A1 -:10A7B0006DE06727BCEA170000E0A0103F8F0C3067 -:10A7C0000CFB5C0054FB6C002D30ABFB6B002EFBD4 -:10A7D0006C0030FB6C0031FB360065F6061800C1DA -:10A7E00011312CFB6C002D300CFB6C002CFACCFFD3 -:10A7F000D41A9B32C9190A16AA2049CFD1FEB0E05B -:10A800000D5C6C581CC0C16E0AF519005E301BFE51 -:10A8100036FF0AF606094B16492A2AB4092EADE37B -:10A82000CD80C0EBCD40E0216DE06727BCEA17008A -:10A8300000E0A010038F0C3006FB560054FB6600AE -:10A840002D30AC00560C001302F1EC5604019300BD -:10A8500000800101940001000025E9010D02F1ECE6 -:10A8600056030000000100FB6C002EFB660030FB6D -:10A87000660031300CFB35006930ABF6051800C1BD -:10A8800061312CFB6C002D301CFB6C002CFACCFFD2 -:10A89000D41A9B32C9190A16AA2049CFD1FEB0DFBB -:10A8A000CFE06B27C0EA1B0000B6866E0BF71A00DC -:10A8B0005E3019FE35FF0AF2050949128A2A2BB6C5 -:10A8C0000A5C6C2EADE3CD80E0D7038001B3F48049 -:10A8D0000153D4D431202D14961697E0A00D5A5C64 -:10A8E0007C187CC030202CC0410C9A0E9BC678305E -:10A8F0000830090C9A0E9BFEB0D20CC052EE1780A5 -:10A90000003083C0283003E06182D8EA118001E082 -:10A9100062966CEA1280013005EA153FF0E0683B70 -:10A92000CEEA18667FE069A09EEA193FE60C9A0E0F -:10A930009BFEB0D1EFC1B20C9A0E9B30080A99FE73 -:10A94000B0D02ABB1B300A0A9B0C980E99FEB0CFE0 -:10A95000EFBB08FEB0D1355D12149816990C9A0E13 -:10A960009BFEB0D16B069C00BFF9001302F1EC56C0 -:10A97000040194000080010195000100004F510185 -:10A980000D02F1EC560300000001005D11C2983089 -:10A99000180A990C9A0E9BFEB0D1CEC1720C9A0E79 -:10A9A0009B30080A99FEB0D009BB1B300A0A9B0CE9 -:10A9B000980E99FEB0CFCEBB08FEB0D1145D12EC5C -:10A9C0001300020C980E99CDFB321CE06B49A0EAF3 -:10A9D0001B0000970C3FFAE06BFFFFEA1B7FFF2F85 -:10A9E000EDD8328001AF28800137D0800138A880AF -:10A9F00001352C800134C480013756B18CF9DCC09C -:10AA000001EC1C00015EFCEBCD40801897E1BC001E -:10AA100000CF5FD303FC1BAA00496A950BFE7B1491 -:10AA2000009707C020D503E3CF8080EBCD40C0184E -:10AA300097FE7C1404780648DC780CEDBC0005CF4A -:10AA4000C2E1BC0000CDBFD303304BF607002BEAB8 -:10AA50001BAA00487A950BA7D6FE7B1404F60709BB -:10AA6000265C5CC020D503E3CF80C0FFFF14D4FF79 -:10AA7000FF1458D4211897EE041605FE761420EC26 -:10AA80000400266C05E1BC0000CB9F0092930013EC -:10AA900002F1EC56040195000080010196000100CE -:10AAA00000DA9A010D02F1EC5603000000010018D3 -:10AAB0009BD303320CF804002CEA1CAA00FE7A1483 -:10AAC00058950C301CEFD7C005F807094C18458D78 -:10AAD000055C5BC020D503D82A0000D4211897EE6E -:10AAE000041605FE761420EC0400266C05E1BC007B -:10AAF00000C97FD303320BF604002BEA1BAA00FE29 -:10AB00007A1458950B301BEFD7C005F607094B1682 -:10AB1000858D055C5CC020D503D82A167BC696F9C6 -:10AB2000DBC28BC440E04C07FFC400E41B000FBB3A -:10AB3000213019B5693008124BFE3CFC03A19CC0C2 -:10AB400032A17A5CFBA36BF7EA13EBA36AF3E9107B -:10AB500030001BF3E9101130001ADCA1995D08F1F7 -:10AB6000E9100CC160167BC086001AF601014B107B -:10AB700000E2090041C078000AF601004B1010E223 -:10AB8000090141A17A5CFB101AF609014BCE7B1634 -:10AB90007B5F7CE00C000A1B0C5C01E20B1601BB26 -:10ABA000015D0AB56CF60C000B5EFCF5EB101C00A9 -:10ABB0004B15001302F1EC560401960000800101D0 -:10ABC00097000100006521010D02F1EC5603000021 -:10ABD0000001005E0CE41B000FC110F60C1200F81F -:10ABE0000C110BF8091120F60C094BF4090A491253 -:10ABF0004BF40C094AF80C1101CADBF40C1200C02A -:10AC000030F409094A2EBCF40B160BB57AF80C1176 -:10AC100001CA1BF5EB101C5E0C3FFCB56C580AF822 -:10AC20000B13005EBC484C321B990B3FFB3FFA5E96 -:10AC3000FE0000000049A0EBCD4080E0672C5DEAFB -:10AC40001700000F8C581CC031E3CF8080E06C2CC3 -:10AC500050EA1C0000781CFEB0F0D0581CC05130E7 -:10AC60001CC5FC301CAE8CE3CF908080017924EBB6 -:10AC7000CD4080E0672C50EA170000E0A00E208F46 -:10AC80002CE0A00E238F1C300CAE8C6E2CE06BAA37 -:10AC900034EA1B8001F94B0248E06BAA60EA1B8092 -:10ACA00001F94B024CE06B9764EA1B8001F94B02FF -:10ACB00050E06B9804EA1B8001F94B0254E06BAC46 -:10ACC00024EA1B8001F94B0258E3CF9080D7038020 -:10ACD00001B3E80072E6001302F1EC56040197009C -:10ACE000008001019800010000F2CA010D02F1ECA0 -:10ACF000560300000001008001B3F4D401E06C2C85 -:10AD000050EA1C0000782CF93C0241580CC021D8B4 -:10AD10000AC11CD8020000D401C0DCD8020000D453 -:10AD200001300CE06B2C50EA1B0000B68CC0BCDA82 -:10AD30000A0000E06B2C5CEA1B0000F72C00005EB0 -:10AD4000FC0000E06B2C5CEA1B0000B68C5EFDD4BE -:10AD5000211897169630053004C0780F9B0F8CC0D1 -:10AD60008C18452FE72FF40C34CF930A9CD8221867 -:10AD70009AFE7C2C00F4091605A9791809588BF95C -:10AD8000BB02081E0B17EB160F0C2C4054687C906E -:10AD9000A4B800301B149CF9DCC005F60C094B93D9 -:10ADA0006B93AB93EB301CF5DAC005F80A094C93B2 -:10ADB0002C5EFD301B149CF9DCC005F60C094B938E -:10ADC0005B93AB93EBCF0B301B149CF9DCC005F607 -:10ADD0000C094B936B939B93EBCE6B301B149CF93C -:10ADE000DCC005F60C094B935B939B93EBCDCB300A -:10ADF0001B149CF9DCC005000343001302F1EC5660 -:10AE000004019800008001019900010000B2710165 -:10AE10000D02F1EC56030000000100F60C094B9303 -:10AE20006B93AB93DBCD2B301B149CF9DCC005F688 -:10AE30000C094B935B93AB93DBCC8B301B149CF9CD -:10AE4000DCC005F60C094B936B939B93DBCBEB308B -:10AE50001B149CF9DCC005F60C094B935B939B9388 -:10AE6000DBCB4B5EFF0000D5E1E067AF28EA17803F -:10AE700001109A129B5D171895FAEA00045D1758A5 -:10AE800015C354581CC334401CA17CC092FAEA007C -:10AE900004EE1B8000FAEB00043084C0283004402C -:10AEA0003CA17CC092FAEA000CEE1B8000FAEB0099 -:10AEB0000CEC140006FAEA000CFAE80004FEB0CF2D -:10AEC00083C082FAEA000CFAE80004FEB0CF10C298 -:10AED000E85805F9BA0700F9BB0700C2A7FAEA006B -:10AEE00004FAE8000CFEB0CF03C238582CC041FA77 -:10AEF000EA0004DE625825C041FAEA000CDE62185E -:10AF000035F9BA0100F9BB0100C051300A300BEA33 -:10AF10001B3FF04019A1793084F9B400530C0013A1 -:10AF200002F1EC5604019900008001019A00010031 -:10AF30000027BA010D02F1EC5603000000010002E7 -:10AF4000004039A179C032EC140006581CC031EC25 -:10AF5000140002089CFEB0F461DE62800138A88013 -:10AF60000137D0800182D8E1BC0000D3035EFCB180 -:10AF70008CF9DCC001EC1C00015EFCD401CF9FC049 -:10AF800020D503D80A0000D401CEFF320BEA1BAA59 -:10AF900000FE7A1818950BE47B0105489A950BCEB4 -:10AFA000EFD80AD401CE1F320BEA1BAA00FE7A1892 -:10AFB00018950B300B483A950BCE1FD80AD703FFD4 -:10AFC000FF1820D401CD1F364BEA1BAA00FE7A18C9 -:10AFD00018950B301B48AA950BCD1FD80A0000D43A -:10AFE00001CC3F364BEA1BAA00FE7A1818950B30AD -:10AFF0000B483A950BCC3FD80AD703FFFF1864D40F -:10B0000001CB3F350BEA1BAA00FE7A1818950B30CE -:10B010001B48AA950BCB3FD80A0000D401CA5F3564 -:10B020000BEA1BAA00FE7A1818950B300B483A95CC -:10B030000BCA5FD80AD703FFFF1850D4211496001B -:10B04000B1C8001302F1EC5604019A00008001011E -:10B050009B000100009801010D02F1EC5603000075 -:10B060000001001697E068DEF7EA18BF29E069F8EA -:10B07000D8EA193FC2FEB0CE22E068B3F4EA18CC99 -:10B08000FEE069991AEA193FC3FEB0CD030C980E91 -:10B0900099FEB0CE14E068CB62EA18D968E0694640 -:10B0A0006FEA193FC7FEB0CCF50C980E99FEB0CEF2 -:10B0B00006E068C9C6EA18DA12E06971C4EA193F05 -:10B0C000CCFEB0CCE70C980E99FEB0CDF8E068E964 -:10B0D0004AEA18948AE0694924EA193FD2FEB0CCC2 -:10B0E000D90C980E99FEB0CDEAE0685FF7EA18999E -:10B0F00097E0699999EA193FD9FEB0CCCB0C980E2C -:10B1000099FEB0CDDCE06855BCEA185555E06955AC -:10B1100055EA193FE5FEB0CCBDD8228001375680F4 -:10B1200001352CD421F8C7FFF9E017FFFC0E3CC015 -:10B1300023D82A5887F9B70308C0482FCCE0A004C9 -:10B1400059E06649A8EA1600006C0C189B580CC11F -:10B1500011ECCBFFFC760C580CC1C0780A0E3AC13A -:10B16000D2F8CB00B4E6001302F1EC5604019B00C8 -:10B17000008001019C000100008C29010D02F1EC0E -:10B1800056030000000100FFFCCF8B74090E39C18B -:10B1900072F4CBFFFC760A580ACF91780CECCBFF07 -:10B1A000FCC038F4CBFFFC760A183AC05074090E84 -:10B1B00039C062CF8BE0A009DDCD31300B580BCC0C -:10B1C000B0760C780AF4C900080E39C042781A9794 -:10B1D0000AC0B8F807000997097819760891190E7E -:10B1E0001A7609930A9907760B580BC060761A589D -:10B1F0000AC0302FCBC028300B8D0B2FCCD822802B -:10B2000001A48C8001AFE8D401300CE06B27C0EAC8 -:10B210001B0000B68CFEB0FDCDD80A80019828D462 -:10B220002124ED189616973005E06C27C0EA1C0023 -:10B2300000F92B0000581BC0A1304CBA8C30ACBABE -:10B24000ACFEB0FDC1BACC3015CDFF0F8C0A0C5846 -:10B250007CC1D50F8C0A0C20AC5C6CF3DCB008C14F -:10B2600008F20810680C08F20C010BF60E10680CBE -:10B270000E3684BD0BB12A2084CFD12FF95C690F23 -:10B280008B1639CEF50F8B00B1BC001302F1EC56D2 -:10B2900004019C00008001019D00010000E6910175 -:10B2A0000D02F1EC56030000000100162CAE8C30AC -:10B2B00009C1280F8CF80810680C081A9EF20C10AF -:10B2C00068180E368CBD0BB12A208CCFD10F8C2F75 -:10B2D000FCAE8C2FF95C690A39CED52B2DD82A808B -:10B2E00001983CEBCD40C020FDFACCFFF0FEB0DB76 -:10B2F00003E06C00B6EA1C0000988B2FFBB80B989B -:10B300008B989A143BC3B3300BB80B3007C2F8E0EC -:10B310006C2B6CEA1C0000781CF91C0186F8070AEB -:10B320004CA19CC232F9D7B008FEB0EAEFC1E5F8F3 -:10B3300006100640DBFC1C42C8FEB0BA75FEB0BC6D -:10B3400025FACBFFF80C0BB60C40EBFC1C42C8FEF8 -:10B35000B0BA6AFEB0BC1AFACBFFF80C0BB61C30C0 -:10B360001CFACBFFF81606ACCC2FF75C6758B7CDAC -:10B3700005FAEA0008BB1BFEB0EADE2F1DE3CF9002 -:10B38000C0D703800153488001735C80011278802C -:10B390000115DC80017388EBCD40C01896169730FC -:10B3A0001C0F8BF60B1068EC0B0B0C00BABF0013D4 -:10B3B00002F1EC5604019D00008001019E00010095 -:10B3C00000735A010D02F1EC560300000001000F5A -:10B3D0008BF60B10680C0BB69C30CB0F8AF40A105E -:10B3E000680C0AB4ABE06B2B74EA1B0000F72A0070 -:10B3F00000580AC080302B0F8AF40A10680C0AB477 -:10B40000CBC0680F8BF60B10680C0BB6CC0F8BF60D -:10B410000B10680C0BB6DC306B0F8AF40A10680C4A -:10B420000AB4EB0F8BF60B10680C0BB64C300CFE0D -:10B43000B0EA260F8BF60B10680C0BB65C300CFED6 -:10B44000B0EA280F8BF60B10681606AC6C0F8C2F29 -:10B45000FCAE8C30CCFEB0EA43E3CF80C0D7038093 -:10B460000172AC800172C08001730CD421E0A00A8B -:10B47000AB1897EF260070C178EE060015EF1C00A0 -:10B480006EEB0B0072180BEB5B0072EB040072F9B1 -:10B49000D6B008FEB0E4021834C045300C28E5AA46 -:10B4A0000C2FF65C665866CE95E06C4154EA1C00A1 -:10B4B00000198C580CC2E0EF1C0066580CC2A1EFBA -:10B4C0002C006D585CC06128678E0C580C5F0C0016 -:10B4D000107B001302F1EC5604019E000080010174 -:10B4E0009F00010000CCE1010D02F1EC56030000C9 -:10B4F000000100D822EF2C006CEF2B0070163CC12D -:10B5000004EF2C006CC088300B5C6CEE0C001A2829 -:10B51000EAB40B2FFCEF2B0070F60C1800CF550E81 -:10B520009C293CF92B0000EE0B001728E78E0C58E5 -:10B530000C5F0CD822D82A8001B3F4800166C8E1E0 -:10B54000BC0000D3035EFCB18CF9DCC001EC1C0034 -:10B55000015EFCD401CF9FC020D503D80A0000D4DF -:10B5600021189716951496CECF3FF48F848FA4E0C0 -:10B570006B00808F0BCEFF8FA4302AE06B02C0E0FF -:10B580006C423CEA1C8000E0A00336E06C4988EA8B -:10B590001C00009937315B8F0BEB3B0009580BC047 -:10B5A000406E0BA1BB8F0BEB3B000A580BC0406EEB -:10B5B0000BBBAB8F0B6E0BEB3A0008F7EA110B8F4E -:10B5C0000B6A0B6A1AF60A0D0A307BF40B0D0A5C43 -:10B5D0005AB16AA5AA8F2AAD0BB92A0D0A18AAE09A -:10B5E0007C00008F7CD82A8001A600D401E0691776 -:10B5F0006CEA19001F86001302F1EC5604019F004B -:10B6000000800101A000010000538A010D02F1EC4D -:10B61000560300000001000000129C2F4C300A303D -:10B620000B189E30A8BD2A2018CFE1129C2F4C1871 -:10B630009E30A8BD2A2018CFE1129CFE3CFE5C186B -:10B640009E30A8BD2A2018CFE1129C2A4C189E30AB -:10B65000A8BD2A2018CFE1129CFE3CFF2C189E307A -:10B66000A8BD2A2018CFE1129CFE3CFEAC189E30EB -:10B67000A8BD2A2018CFE1300CB28CB29CB2CCB25B -:10B68000DCB2ACB2BCB2ECB24CB25CE06C4000EAF2 -:10B690001C447EF34C01F4F2EB0124F2EB012CF29A -:10B6A000EB0134F2EB0144F2EB013CF2EB014CD83C -:10B6B0000A0000300CE06B28F0EA1B0000B68C5E3C -:10B6C000FF0000EBCD4080201D3007189B5C5B2005 -:10B6D0001BC060201BC060201BC0E0C0583017C0DA -:10B6E000B83027C0983037500CE06CC210EA1C808C -:10B6F00001FEB067870E9C5C6C2FFDE3CD808080DF -:10B70000006FE8EBCD40C018961697301C0F8BF6F3 -:10B710000B1068EC0B0B0C00E60A001302F1EC5660 -:10B720000401A00000800101A100010000EF3B0125 -:10B730000D02F1EC560300000001000F8BF60B1018 -:10B74000680C0BB69C302C0F8BF60B10680C0BB6EC -:10B75000ACE06B28F0EA1B0000F72C0000CC5F0F78 -:10B760008BF60B10681606ACCC0F8C2FFCAE8CCB76 -:10B770004FE3CF80C00000B18CF9DCC001EC1C00AD -:10B78000015EFCEBCD408048BC7807E1BC0000FEC8 -:10B79000B0FFF4D303350BEA1BAA00FE7A18189504 -:10B7A0000BA1C7484B97075C5CC020D503E3CF8053 -:10B7B00080D703FFFF1850D401E1BC0000FEB0FFAA -:10B7C000DDD303364BEA1BAA00FE7A1818950B301E -:10B7D0001B490A950B5C5CC020D503D80A0000EB1E -:10B7E000CD408048BC7807E1BC0000FEB0FFC6D366 -:10B7F00003364BEA1BAA00FE7A1818950BA1C7481E -:10B800004B97075C5CC020D503E3CF8080D703FF54 -:10B81000FF1864D401300CC068F20C0029F34B000F -:10B82000982FFCE0690F28EA190000300B589CCFD4 -:10B8300055E06C10B4EA1C0000991B003C17001383 -:10B8400002F1EC560401A10000800101A2000100F8 -:10B85000007AF0010D02F1EC56030000000100F344 -:10B860004B00FC364A930A931AFC1A4140932AFC77 -:10B870001A3E80933A934A935A936A937AE06A33D2 -:10B8800033EA1A3EB3938A305A939A93AA300AC085 -:10B8900068F20A0028F14B00982FFA589ACFA59920 -:10B8A0002B993B994B129CFE3CFEF0F34C010C1281 -:10B8B0009CFE3CFEF0300A189E32D8BD2A2018CFDC -:10B8C000E19D0A2D49B31B932AD80A782CB98CF92B -:10B8D000DCC0015EFC0000782CBD8CF9DCC0015E90 -:10B8E000FC0000D421201D18951694149712963050 -:10B8F0000C500C0A9CCF1FC0F0FEB0658B301BFEB5 -:10B90000B06870400B2FFB500B400CE04C07D0CFC1 -:10B9100023300CC0E8A964A1A4EB440040B1678BBC -:10B92000070A9CCD4FCFE10C9B0A9CC08C301C2F8A -:10B93000FDD82280006DB080007380EBCD40C01830 -:10B940009616970C9CCC3FCFE18D170C9CCBFFCF6C -:10B95000E1E3CF80C00000998B5EFDD401E06C0074 -:10B960003ADE001302F1EC560401A200008001014E -:10B97000A300010000C54B010D02F1EC56030000CD -:10B9800000010028FCEA1C0000780CF93C02215858 -:10B990000CC021D80AC07CD8020000D401300CC0F1 -:10B9A000ACDA0AE06B2904EA1B0000F72C00005E09 -:10B9B000FC0000E06B2904EA1B0000B68C5EFDD49D -:10B9C00001189A301C1789F2091068F4090B0C173A -:10B9D00089F20910681409B29C311C1789F2091008 -:10B9E000681409B2ACE06C2905EA1C0000F92900D2 -:10B9F00000178CF80C1068180AB4C9178C2FFCB605 -:10BA00008CCCDFD80A0000E06A07FF7809F5E9036B -:10BA1000491439C0B1780BF7DBC014C051781C58F9 -:10BA20000CC0215EFF302C5EFC780AF5DAC01FC026 -:10BA300051781A580AC0215EFDE06A0433142916B1 -:10BA40001958195E5D300AE0490035C075780BE67B -:10BA50001B8000990B991A5EFE3018F7D9C005F0CB -:10BA60000B09482018A789C092780B1668105B99BB -:10BA70000B781B1648991AC058781B1668105B99EA -:10BA80001B580800E2CB001302F1EC560401A3009E -:10BA900000800101A400010000D163010D02F1EC5E -:10BAA000560300000001003FFCF9BC00005EFCFEF4 -:10BAB000792C00F80A1605A97A120A3019F9DCC0A7 -:10BAC00005F20C0949EDBB0002C042F5490074C003 -:10BAD00038F5490078EDBB0007C1B2169CE21C01A5 -:10BAE00080C060F54900A8F54900B8C128169CE25D -:10BAF0001C0280C060F54900A4F54900B8C0981642 -:10BB00009CE21C0380C050F54900A8F54900B4ED43 -:10BB1000BB0000C0C2EDBB0001C042F5490054C0EB -:10BB200038F5490058F5490044C038F549004895B2 -:10BB3000195EFD580C5E0DF8FBFFFC204C588B5E27 -:10BB40003DF5DBC0025E1DE06A49A8EA1A000074F8 -:10BB5000195809C030123CC0529919951CC1A8103F -:10BB60009972185808C0301838CFB37208120810EC -:10BB70003C5E3D1838C061720C160C930C129CC0D0 -:10BB80009872185808C040180B16385E3D991893E3 -:10BB90001C781B580B5E0D7809180916395E1D308C -:10BBA000099509760A7809005658001302F1EC56F7 -:10BBB0000401A40000800101A500010000BBDB011D -:10BBC0000D02F1EC560300000001001409990976FA -:10BBD0001B991B5EFD0000EBCD40803007E06C2B15 -:10BBE00074EA1C0000F92B0000580BC061FEB0E79E -:10BBF0005D581CC02530170E9C5C6CE3CD8080EB3B -:10BC0000CD40803007E06B2B74EA1B0000F72A0060 -:10BC100000580AC080E04C00C8C151FEB0E74C1883 -:10BC200097C118E04C00C8C071FEB0E73F582CC067 -:10BC3000A53017C088E04C00C4C051FEB0E73658AC -:10BC40001CCF840E9C5C6CE3CD8080800173E88007 -:10BC50000173DCEBCD4080E0674558EA170000FE39 -:10BC6000B0F048EF4C0104300CC068EE0C002AF52F -:10BC70004B008C2FFC300B589CCF95EF4B0100EF05 -:10BC80004B00FCFEB0F020EF4C0118E06C01F48F8B -:10BC90000C8F1CFC1C41408F2CE06C999AEA1C3FD5 -:10BCA000198F3C8F4C8F5CFC1C3E808F6C8F7CE02E -:10BCB0006C3333EA1C3EB38F8C307C8F9C8FACE3AB -:10BCC000CF808080018624800185F8007789001369 -:10BCD00002F1EC560401A50000800101A60001005C -:10BCE000002E10010D02F1EC56030000000100F6D9 -:10BCF000091605E068B940EA188001F009003870BB -:10BD000018F7DBC005F00B092CFE7C1000F80900C9 -:10BD10002CE06B4000EA1B8000580AC081E06A41B9 -:10BD200028EA1A8000142B990B5EFD581AC091E086 -:10BD30006A4136EA1A8000142BBFAB990B5EFD589E -:10BD40002AC091E06A4144EA1A8000142BBFBB99D3 -:10BD50000B5EFDE06A4152EA1A8000142BEA1BC018 -:10BD600000990B5EFD0000581C5E5DE06B288CEABC -:10BD70001B0000962A180AB62A962CE04C03E85EAF -:10BD80005D962CE02C03E8B62CF72C00022FFCB6B5 -:10BD9000ACF72C0002E04C003C5E5DF72C00022367 -:10BDA000CCB6ACF72C00012FFCB69CF72C0001E0C0 -:10BDB0004C003C5E5DF72C000123CCB69CF72C00B8 -:10BDC000002FFCB68CF72C0000598C5E5D300CB651 -:10BDD0008C5EFDD021E06CC320EA1C8001190B1998 -:10BDE0000A1909F7EA1008F1D8C002C221F20800C6 -:10BDF0006CA3001302F1EC560401A60000800101BF -:10BE0000A70001000091AB010D02F1EC5603000008 -:10BE10000001001603C1F0F3D9C003143BC080B782 -:10BE200007B5262018CFD15809C171C0C8300630D7 -:10BE300007B5262018CFC15809C050300B14CB20AD -:10BE400019CFD1E06BC338EA1B8001163CCDA3D0DB -:10BE5000225EFD143BCF30173814C82019CF30CFE5 -:10BE6000CB0000EBCD4080E0673F20EA170000E008 -:10BE7000A0064C8FAC300CC088F80B10340E0B2D84 -:10BE80004BEE0C092B2FFC58ACCF85E0A00464E0EE -:10BE9000A00582E0A00544FEB0A4C4E0A00570FEA9 -:10BEA000B0A2AAE0A00530E3CF80808001B3F48087 -:10BEB00001B0408001B2808001B2088000F10C80A6 -:10BEC00001B2688000ECE08001B1F0EBCD4080E091 -:10BED000672B6CEA170000E0A006128F1CFEB06210 -:10BEE000F38F0C6E1CE06BAD34EA1B8001F94B0143 -:10BEF00088E06BB308EA1B8001F94B018CE06B9D75 -:10BF000038EA1B8001F94B0190E06BA50CEA1B801D -:10BF100001F94B005406001302F1EC560401A7008E -:10BF200000800101A8000100000640010D02F1ECB3 -:10BF3000560300000001000194E06B9DECEA1B80B9 -:10BF400001F94B0198E3CF9080D7038001B3E880DB -:10BF5000006DB0EBCD4080E06728F0EA170000E00C -:10BF6000A005E08F2CFEB062C18F1C6E2CE06BAC84 -:10BF7000F8EA1B8001F94B0048E06BB364EA1B80D0 -:10BF800001F94B004CE06BADE8EA1B8001F94B0076 -:10BF900050E06BB0B8EA1B8001F94B0054E06BA095 -:10BFA000ECEA1B8001F94B0058E3CF9080D7038067 -:10BFB00001B3E880006DB0E06C4000EA1C8000E353 -:10BFC000BC00015EFD0000D401CF7F300BC208E051 -:10BFD00069432CEA198000781CF80A09292FFAE035 -:10BFE0006CB940EA1C8001F80B003C7809123ACF8A -:10BFF00003E06A4128EA1A8000E06C4000EA1C80F5 -:10C0000000181AFE7C1000F80B092A2FFB59FBC000 -:10C0100032300ACE6BD80AD42118961697E06B07F7 -:10C02000FF6E0CF7EC034C3005163CC0C1AC056E3E -:10C030000CF9DCC014C041007A98001302F1EC56F0 -:10C040000401A80000800101A90001000046FB01D5 -:10C050000D02F1EC560300000001006E1C580CC0EC -:10C0600030302CD822DA2A581CC0640E9CE0A00183 -:10C07000D3581CC0C46E0BE41B800FEA1B3FE08F3B -:10C080000BE02C03FEAC0C3FFCD822AC05D82A8078 -:10C0900001ACB8D401E0A00557E06B2C88EA1B0086 -:10C0A00000970CE06BB400EA1B8001F94B00C8E07C -:10C0B0006BB420EA1B8001F94B00CCE06BB410EAB2 -:10C0C0001B8001F94B00D0E06BB40CEA1B8001F936 -:10C0D0004B00D4E06BB41CEA1B8001F94B00D8DAAA -:10C0E0000AD7038001B3E8D401E0A0052DE06B2C52 -:10C0F00084EA1B0000970CE06BB400EA1B8001F996 -:10C100004B0168E06BB420EA1B8001F94B016CE045 -:10C110006BB410EA1B8001F94B0170E06BB40CEAC0 -:10C120001B8001F94B0174E06BB41CEA1B8001F920 -:10C130004B0178DA0AD7038001B3E8EBCD408018D1 -:10C1400097FEB061E55817C0905827C0B05837C067 -:10C15000D05877C0F0E3CF9080FEB000C89E0013A7 -:10C1600002F1EC560401A90000800101AA000100BF -:10C1700000D330010D02F1EC560300000001006411 -:10C18000B9E3CF9080FEB064B9E3CF9080FEB06495 -:10C19000A3E3CF9080FEB064A9E3CF9080D7038063 -:10C1A000006DB080007370800073788000735480DD -:10C1B000007368D401312A300B300CFEB0D40C5817 -:10C1C0002CC031302CD802E0A00324300CE06B2CC2 -:10C1D0005DEA1B0000B68CDA0AD7038001B090D468 -:10C1E00001312A300B301CFEB0D3F6583CC0313040 -:10C1F0003CD802300CE06B2C5DEA1B0000B68CDAF8 -:10C200000AD70380015254D401E0A004AFE06B2BA5 -:10C21000C0EA1B0000970CE06BB400EA1B8001F938 -:10C220004B0088E06BB420EA1B8001F94B008CE0E6 -:10C230006BB410EA1B8001F94B0090E06BB40CEA80 -:10C240001B8001F94B0094E06BB41CEA1B8001F9E0 -:10C250004B0098DA0AD7038001B3E8D401E0A004C8 -:10C2600085E06B2B68EA1B0000970CE06BB400EADA -:10C270001B8001F94B0148E06BB420EA1B800100F0 -:10C28000013A001302F1EC560401AA0000800101FA -:10C29000AB000100006C8B010D02F1EC56030000B5 -:10C2A000000100F94B014CE06BB410EA1B8001F96E -:10C2B0004B0150E06BB40CEA1B8001F94B0154E0D8 -:10C2C0006BB41CEA1B8001F94B0158DA0AD70380D2 -:10C2D00001B3E8D5A1E067A384EA178001301BFA17 -:10C2E000CCFFFC5D175C7C201CC190201CC1703011 -:10C2F0000BFACCFFFC5D17C120401CA17CFAE800C2 -:10C3000004300AC052300BEA1BBFF0C048300BEAC1 -:10C310001B3FF0FEB0C4DEFAEB0004FAEA0004D8DA -:10C3200062D7038001352CD401E06C10CCEA1C00EC -:10C3300000300B990B991B992B300A995AE069111F -:10C3400004EA19000030589338993A994A996B9940 -:10C350007B998B999B99AB99BB99CA99DA129C2EC0 -:10C360004C934C129C2E4C189E32D8BD2A2018CFCC -:10C37000E19D0AB31B932AD80A0000D401FB2C00CC -:10C3800005592CC071FB3B000C300CFEB085A2D8C7 -:10C390000A593CC071FB3B000D301CFEB0859AD899 -:10C3A0000A594C00C579001302F1EC560401AB00A8 -:10C3B00000800101AC0001000078A3010D02F1EC46 -:10C3C00056030000000100C071FB3B000E302CFE44 -:10C3D000B08592D80A595CC051FB3C000CFEB08578 -:10C3E0009BD80A8000B72C8000B74CD401189A3033 -:10C3F0001C1789F2091068F4090B0C1789F209104F -:10C40000681409B29C312C1789F20910681409B21A -:10C41000ACE06C2C50EA1C0000F9290000178CF8E5 -:10C420000C1068180AB4C9178C2FFCB68CFEB0EF3C -:10C43000A5D80A80018BB0D401E0A003BBE06B2833 -:10C44000D0EA1B0000970CE06BB400EA1B80019956 -:10C45000ABE06BB420EA1B800199BBE06BB410EA3F -:10C460001B800199CBE06BB40CEA1B800199DBE0E7 -:10C470006BB41CEA1B800199EBDA0A8001B3E878FF -:10C480000AE61A8000301B7809F3D9C0149909C054 -:10C49000D178195809C0A1C1087819A178F1E91318 -:10C4A000F89908A1799919201B7808EDB80014CFE4 -:10C4B00052F3D8C01499097809124A990A5EFBD43C -:10C4C00001302A301B300C00CFD6001302F1EC569D -:10C4D0000401AC0000800101AD00010000121B014D -:10C4E0000D02F1EC56030000000100FEB0D2AA5884 -:10C4F0002CC031302CD802302A305B300CFEB0D248 -:10C50000A1582CCF80FEB0686D300CE06B28F0EAAB -:10C510001B0000B68CDA0A8001525480007DF4D4EE -:10C52000019ADCE06B00B6EA1B0000B61C582CC078 -:10C5300055FE3C0002B60CC038300CB60C30CAFBBD -:10C540003B00085C6B300CFEB0D27C583CC03130F4 -:10C550002CD802DA0AD70380015254D401307A3041 -:10C560000B300CFEB0D26E582CC031302CD8021BD0 -:10C57000CCE0A00083DA0A8001AE8CD401307A309E -:10C580000B301CFEB0D25E583CC031303CD802DAD1 -:10C590000AD70380015254D401310A301B300CFEFB -:10C5A000B0D250582CC031302CD802E0A002AEDA04 -:10C5B0000AD7038001B31CD401310A301B301CFEA2 -:10C5C000B0D240583CC031303CD802DA0AD70380A0 -:10C5D000015254D40120EDFACCFFF4FEB0D2ACFAF3 -:10C5E000CCFFE8780A500A781A501A002FC30013BB -:10C5F00002F1EC560401AD0000800101AE00010023 -:10C600000087D0010D02F1EC560300000001007814 -:10C610002A502AFEB06840E06B28F0EA1B0000B602 -:10C620008C2F2DDA0AD7038001534880007E84D4F2 -:10C63000A1201D1897500CFAC9FFF8169A1A9BE012 -:10C640006CB3DCEA1C8001FEB06F8C300B400AB486 -:10C650008BF8071760C036400C18270E9C2FFDD8AA -:10C66000A2D70380008D50E06C1B40EA1C00003014 -:10C670000BF94B0938B86BB87B305AF94A09B0F955 -:10C680004B0944300AF94A095CF94A098C998A999C -:10C690002AF95B00FAF95B00FC5EFDE06B0008EA3A -:10C6A0001B0000971CE06C0E88EA1C0000300A306A -:10C6B0000BB91B992A189B2E4B993B189B2CCB9995 -:10C6C0004B189B2B4B995B189B29CB996B5EFDFEFE -:10C6D0007B12005C3CF60C002B763CFE7B1100F6D6 -:10C6E0000C032B580B5E0DF60A1200E06BB940EA02 -:10C6F0001B8001F60C003B761C5C3AF80A002C7992 -:10C70000FC5EFC488CE3BC0001F01F000AC0300056 -:10C71000F728001302F1EC560401AE00008001017D -:10C72000AF00010000386B010D02F1EC5603000070 -:10C73000000100F01F0009D743F01F0005F01F00A3 -:10C7400005E9B00002CFEB800040008001807C80D2 -:10C7500001B3AC8000D5788001A6E4149C169AE061 -:10C760006B07FFF7EA0349F5DAC0141639C0A05881 -:10C7700009C0205EFE580AC031580C5E0D3FEC5EC9 -:10C78000FC580AC031580C5E0F302C5EFC0000EBE8 -:10C79000CD4080E0672BBAEA170000303A0E9B309C -:10C7A0003CE0693F20EA190000722972B972895D84 -:10C7B00019C051300CAE8CAE9CAEACE3CF8080EB98 -:10C7C000CD4080340C3007300EA17A5CFB5CFE5CFF -:10C7D000F7103EF2071300C053101EEE090147A1E7 -:10C7E000AA201CCF310E991C98E3CD80800000EB6D -:10C7F000CD4080300CE06B4158EA1B0000970CE004 -:10C80000674174EA170000FEB0EB288F1C305C8F84 -:10C810000CE3CF9080D70380018624E06B49A4EA23 -:10C820001B0000760C580CC0205EFDE06C4A94EAB8 -:10C830001C00000063D5001302F1EC560401AF00A8 -:10C8400000800101B0000100002803010D02F1EC9D -:10C8500056030000000100970CE06B5294EA1B00A5 -:10C8600000E01BFFFC181B990B5EFCD401C03CDAF6 -:10C870000A0000D401E0A001EBE06B27B8EA1B003E -:10C8800000970C307BF96B007EF96B007FF96B0031 -:10C8900080DA0A8001B3F4EBCD4080E067BCB0EAF7 -:10C8A0001780010E9B300CFEB0EBD02DC70E9B30D5 -:10C8B0009CFEB0EBCBE3CF8080D703800187F0EB09 -:10C8C000CD40803007FEB0F3D9581CC081301CE049 -:10C8D0006B27C0EA1B0000B68C30170E9C5C6CE323 -:10C8E000CD808080019820E06C2608EA1C00003092 -:10C8F0000B990B991B992BE06C2614EA1C000099EC -:10C900001B992B993BB88B301BB89B5EFD00003008 -:10C910000CE06B28F0EA1B0000762A2BFA158A58E7 -:10C920000AC0215EFDF72A0000580AC020301C5CB6 -:10C930006C5EFC103AF20B1300C070F7E9100CF5B6 -:10C94000EC101C104C5EFCF9DBB28B5BFC5E1DF541 -:10C95000EB10CC5EFC000000FEC9001302F1EC56A7 -:10C960000401B00000800101B1000100003CBE01E3 -:10C970000D02F1EC56030000000100580C5E0DE0C2 -:10C980006B1B40EA1B0000781AF74A00C4780AF7CC -:10C990004A00C0984CF75C00C85EFD580C5E0DE084 -:10C9A0006B1B40EA1B0000F6FB0A08328AB709B984 -:10C9B00028208ACFD1228C5EFD0000F7EC200AC02F -:10C9C00060F7EC100AF40A15011C9FEA1AFF00F444 -:10C9D0000C011A5F3A147A1C9F0000FE7A2C00F8B2 -:10C9E0000B1605A97B140B301AF9DCC005F40C09F1 -:10C9F0004AF74A0048971A5EFD0000301A189BF764 -:10CA0000DBC005F40B094AFE7B2C00A59CA97C1613 -:10CA10000CF94A00585EFDEBCD40803007FEB05E59 -:10CA20000DC02030170E9C5C5CE3CD8080D7038066 -:10CA3000006DBCD401E06C28F0EA1C0000781C2BCF -:10CA4000DC198CFEB06656DA0AD70380007E74309B -:10CA50001A189BF7DBC005F40B094AFE7B2C00A5D6 -:10CA60009CA97C160CF94A00545EFDD401E06BBD14 -:10CA700078EA1B8001306CFEB0EAFA00741D0013E6 -:10CA800002F1EC560401B10000800101B200010086 -:10CA900000A975010D02F1EC56030000000100D859 -:10CAA0000AD703800187F0D401E06BBE2CEA1B801B -:10CAB00001301CFEB0EAEED80AD703800187F0D41B -:10CAC00001E06BBE08EA1B8001307CFEB0EAE2D8D0 -:10CAD0000AD703800187F0D401E06BBD9CEA1B807C -:10CAE00001307CFEB0EAD6D80AD703800187F0D4A3 -:10CAF00021201D189750071A9B301CE0A000D6CFAC -:10CB0000BBD7038001B408D401E06BBDE4EA1B800D -:10CB100001303CFEB0EABED80AD703800187F0D4CA -:10CB200001E06BBDC0EA1B8001302CFEB0EAB2D838 -:10CB30000AD703800187F0E06B2BBAEA1B000017CD -:10CB40008AB88A179AB89A17ABB8AB5EFD0000E0B6 -:10CB50006B288CEA1B00003069172A18BA2029CFED -:10CB6000D1206C5EFC0000E06C10CCEA1C000030B0 -:10CB70000B990B991B992B99CB99DB5EFD00005CFF -:10CB80005BC0382FFC201A580A5E0D19891639CF60 -:10CB9000A15EFCE069288CEA190000B28CB29B000F -:10CBA00000CD001302F1EC560401B2000080010137 -:10CBB000B30001000016CE010D02F1EC5603000097 -:10CBC000000100B2AA300CB22C5EFDE06C00B6EAA7 -:10CBD0001C0000301BB81B300BB80B5EFF0000E0E0 -:10CBE0006C4684EA1C0000300B990B991B992B5E54 -:10CBF000FD0000D021F80B0C06AD3B161C189A0C5A -:10CC00009BD0225EFC00005C5B198A163A5E0C2FFA -:10CC1000FC580ACFB15EFD189BC0282FFB178A581D -:10CC20000ACFD1162C5EFC300CE06B28F0EA1B001A -:10CC300000B68C5EFF0000E06C1B40EA1C0000F8B0 -:10CC4000FC09F45EFC0000300CE06B4158EA1B006C -:10CC500000970C5EFF0000D401FEB0FF03D80280F5 -:10CC600001B19CE06B4154EA1B0000B68C5EFDD420 -:10CC700001FEB04625D80A80003FF8D401FEB095E9 -:10CC800023D8028000DE00E06B2B74EA1B0000B6A4 -:10CC90008C5EFDE06B4378EA1B0000970C5EFD782C -:10CCA0000AB48B780B2FFB990B5EFCE06C2908EA29 -:10CCB0001C00005EFC0000E06C2730EA1C00005EF7 -:10CCC000FC000000400D003B02F1EC560401B300F3 -:10CCD00000800101B4000100030000000022302C9C -:10CCE0005EFC5EFD00005EFD00005EFD00005EFF7C -:10CCF00000005EFF00005EFF00005EFD00005EFFC2 -:10CD00000072EB00F502F1EC560300002400DCBFDA -:10CD1000F000000000000080000000000000008023 -:10CD2000000000000000000000000000000000BF44 -:10CD3000EE9452C0000000BE514E2048000000BCDE -:10CD4000BC6764F80000000000000000000000BFA5 -:10CD5000ED338120000000BE14DBB380000000BC76 -:10CD6000A30667500000000000000000000000BFA4 -:10CD7000EBDCE9D0000000BE5992C308000000BC03 -:10CD8000B8D3B0800000000000000000000000BF29 -:10CD9000EA8FF970000000BE2810A5C0000000BC9A -:10CDA000B0C0BFE80000000000000000000000BFAD -:10CDB000E94C2870000000BE424B1360000000BC2C -:10CDC000B8203DC00000000000000000000000BFCF -:10CDD000E810FA50000000BE2BF65FC0000000BC57 -:10CDE000A7715C90000000000000000401B4000086 -:10CDF000800101B5000100008256010D02F1EC56E0 -:10CE000003000000010000000000BFE6DDFC200080 -:10CE10000000BE54F1F8C0000000BCB9F6E91800EB -:10CE200000000000000000000000BFE5B2C3D00019 -:10CE30000000BE5432E470000000BCB406DB5000B9 -:10CE400000000000000000000000BFE48EEF1000B2 -:10CE50000000BE5262F320000000BC9A872AC00086 -:10CE600000000000000000000000BFE37222B000DC -:10CE70000000BE56E0E8F0000000BCBD2D352800E3 -:10CE800000000000000000000000BFE25C0A00009B -:10CE90000000BE418EFAB0000000BCBD6FAE400085 -:10CEA00000000000000000000000BFE14C56000040 -:10CEB0000000BE5FCD15F0000000BC901C14000007 -:10CEC00000000000000000000000BFE042BD400084 -:10CED0000000BE5734F930000000BC931E6CE00027 -:10CEE00000000000000000000000BFDE7DF5E00053 -:10CEF0000000BE5E538AB0000000BCAA77DA800052 -:10CF000000000000000000FE6F001302F1EC560468 -:10CF100001B50000800101B600010000FD95010D82 -:10CF200002F1EC5603000000010000000000BFDC2D -:10CF3000819DC0000000BE26A2FF00000000BCB022 -:10CF4000E257600000000000000000000000BFDAAF -:10CF50008FF960000000BE51810A58000000BCB883 -:10CF6000605FF00000000000000000000000BFD87B -:10CF7000A89800000000BE457F7A60000000BCA3B6 -:10CF80003354D00000000000000000000000BFD6B5 -:10CF9000CB0F60000000BE40CB91D0000000BCA0D1 -:10CFA0001B6D400000000000000000000000BFD426 -:10CFB000F6FBA0000000BE52CEC598000000BC7E6B -:10CFC000393A000000000000000000000000BFD35C -:10CFD0002BFEE0000000BE2B877340000000BC79F0 -:10CFE0006892000000000000000000000000BFD1B7 -:10CFF00069C040000000BE5363F158000000BC7CD3 -:10D000008D43800000000000000000000000BFCF42 -:10D010005FD880000000BE54831F18000000BCA22F -:10D02000423FB00000000000000000DB1C001302C3 -:10D03000F1EC560401B60000800101B700010000C8 -:10D04000422E010D02F1EC56030000000100000029 -:10D050000000BFCBFC6780000000BE53FFFA6000F9 -:10D060000000BCB80DE0500000000000000000000F -:10D070000000BFC8A89800000000BE357F7A60009D -:10D080000000BC933354C00000000000000000000A -:10D090000000BFC563DC00000000BE54FFD658008E -:10D0A0000000BC9064390000000000000000000097 -:10D0B0000000BFC22DADC0000000BE1559A4800005 -:10D0C0000000BCAB4B48E000000000000000000086 -:10D0D0000000BFBE0B1A80000000BE5A3CBF5000CB -:10D0E0000000BCB664B3A000000000000000000017 -:10D0F0000000BFB7D60480000000BE36CFBB4000A2 -:10D100000000BCA8CE7680000000000000000000F7 -:10D110000000BFB1BB3280000000BE43002A4000C7 -:10D120000000BCBD0CC6280000000000000000008C -:10D130000000BFA7739400000000BE593B2B1800ED -:10D140000000BCA55DE5C000000000000000001864 -:10D150007F001302F1EC560401B70000800101B812 -:10D1600000010000D5C5010D02F1EC5603000000DE -:10D17000010000000000BF9743EE00000000BE4029 -:10D18000C3E6A0000000BCB58D95200000000000A3 -:10D19000000000000000800000000000000080008F -:10D1A00000000000000080000000000000000000FF -:10D1B00000000000000080003A5480003A04800023 -:10D1C0003A5480003A2C80003BB480003BC480007D -:10D1D0003B8080003A5480003D9C80003D488000A8 -:10D1E0003D6C80003BE480003C1C80003C6C800077 -:10D1F0003A5480003E1C80003A5480003A2C800053 -:10D200003DAC80003DBC80003DCC80003A548000A5 -:10D210003E2C80003A5480003A2C80003BB48000C1 -:10D220003BC480003B8080003E8480003EDC800068 -:10D230003EA480003EF880003E3C80003E608000BE -:10D240003B8080003F1880003A0480003F38800017 -:10D250003A2C80003BB480003BC480003B808000BF -:10D260003A5480003A0480003F7080003A2C8000DD -:10D270003BB40011C5001302F1EC560401B80000E4 -:10D28000800101B900010000957E010D02F1EC560C -:10D2900003000000010080003BC480003B80800050 -:10D2A0003FA880003A0480003FA880003A2C80000C -:10D2B0003BB480003BC480003B8080003FBC8000CA -:10D2C0003A0480003A5480003FD880003E3C800001 -:10D2D0003E6080003B8000000001000049B000007B -:10D2E0000002000049B400000001000049BC000039 -:10D2F0000001000049C000000004000049C4000013 -:10D300000004000049D400000000000049E40000CF -:10D310000001000049E800000001000049EC0000A5 -:10D320000001000049F000000004000049F4000082 -:10D33000000400004A040000000500004A14000038 -:10D34000000100004A280000000800004A2C0000EC -:10D35000000100004A4C0000000000004A5000009C -:10D36000000000004A540000000000004A5800007D -:10D37000000100004A5C0000000100004A6000005B -:10D38000000100004A640000000100004A6800003B -:10D39000000000004A6C00A807001302F1EC5604DC -:10D3A00001B90000800101BA0001000000B5010DC3 -:10D3B00002F1EC5603000000010000000000000034 -:10D3C0004A700000000300004A74000000000000E2 -:10D3D0004A800000000000004A84000000000000B5 -:10D3E0004A880000000100004A8C00000001000093 -:10D3F0004A90000000000000000000000000000053 -:10D40000000000000000000000000000000000001C -:10D41000000000000000000000000000000000000C -:10D4200000000000000000000000000000000000FC -:10D4300000000000000000000000000000000000EC -:10D4400000000000000000000000000000000000DC -:10D4500000000000000000000000000000000000CC -:10D4600000000000000000000000000000000000BC -:10D4700000000000000000000000000000000000AC -:10D48000000000000000000000000000000000009C -:10D49000000000000000000000000000000000008C -:10D4A000000000000000000000000000000000007C -:10D4B00000000000000000000000002735001302FB -:10D4C000F1EC560401BA0000800101BB000100002C -:10D4D000BF0E010D02F1EC56030000000100000038 -:10D4E000000000000000000000000000000000003C -:10D4F000000000000000000000000000001E00000E -:10D500000028000000320000003C0000014A00003A -:10D51000003C00000096000000F00000014F0000F9 -:10D5200000410000009B000000F5000001540000D5 -:10D530000046000000A0000000FA0000015E0000AC -:10D540000050000000AA000001040000001E0000BE -:10D550000078000000D20000012C0000001900003B -:10D560000073000000CD000001270000001400003F -:10D57000006E000000C8000001220000000A000048 -:10D580000064000000BE0000011800000000000060 -:10D59000000000000000000000000000000000008B -:10D5A000000000000000000000000000000000007B -:10D5B000000000000000000000000000000000006B -:10D5C000000000000000000000000000000000005B -:10D5D0000000000000000000000000000000000B40 -:10D5E000B5001302F1EC560401BB0000800101BC40 -:10D5F00000010000AB26010D02F1EC560300000013 -:10D600000100000000000000000000000000414C8C -:10D610004F4620256400414C434620256400524C6F -:10D62000434620256400504C4F4620256400504C52 -:10D6300043462025640050414F4620256400504158 -:10D6400043462025640050504F462025640050502A -:10D650004346202564004558204C4D454C20256408 -:10D6600000004558204C4D43523120256400455858 -:10D67000204C4D435232202564202564202564002F -:10D6800000004558204C4D4352332025642025642A -:10D69000202564202564000000004558204C4D439F -:10D6A0005234202564202564202564202564000050 -:10D6B000000080010B5C80010DAC80010DFC80013D -:10D6C0000DFC0000000080010E50000000008001F1 -:10D6D0000FEC0000000080010B5C80010F3C80011A -:10D6E0000FA000000000000000000000000000008B -:10D6F00000000000000000000000534D41432025C1 -:10D7000064200019F6001302F1EC560401BC00007D -:10D71000800101BD00010000C19E010D02F1EC5627 -:10D720000300000001002564202564000000534D23 -:10D730004120256420256420256400000000534D0D -:10D740005243202564202564202564000000534DA9 -:10D75000522025642025642025640000000000007C -:10D760000000000000003FE0C152382D73663FF911 -:10D7700021FB54442D183FF0C152382D73663FF9F8 -:10D7800021FB54442D184000C152382D73664009C6 -:10D7900021FB54442D184004F1A6C638D03F800127 -:10D7A000785C800178B0800178C8000000008001BA -:10D7B000778C8001779400000000800178CC000015 -:10D7C000000080017B3880017B9880017BE4800130 -:10D7D0007C000000000080017C1C000000000000B4 -:10D7E000000000000000800142208001428880018A -:10D7F00042AC800142D00000000080014370000074 -:10D800000000800144908001462C800105C0800109 -:10D8100006C48001080C8001081C8001073C8001BF -:10D82000082C0000000000C0FE001302F1EC5604BA -:10D8300001BD0000800101BE000100005455010D32 -:10D8400002F1EC5603000000010080010A80800113 -:10D850000B3480018108800181408001817080014A -:10D8600081A800000000800181E4000000000000A9 -:10D87000000000000000800059FC80005AE4800095 -:10D880005B8080005BA80000000080005BD000008F -:10D89000000080006570000000008000E91080003A -:10D8A000E9A88000EA6C8000EAE400000000800043 -:10D8B000EB5800000000000000008000ECD0800069 -:10D8C000ECF48000EDDC8000EF808000F0100000C0 -:10D8D00000008000F0748000F0B000000000000044 -:10D8E00000005354256420530000535420536B69A7 -:10D8F000700053542564204600005354256420438F -:10D900000000436865636B4C696768744C757820E8 -:10D9100053746F70000053746F70204661696C001F -:10D920000000537461727420436865636B4C6967CF -:10D9300068744C7578005374617274204661696C28 -:10D9400000000004000800100020007121001302F4 -:10D95000F1EC560401BE0000800101BF000100008F -:10D96000EBEE010D02F1EC56030000000100003067 -:10D9700000400060008000C0010001800200030040 -:10D9800004000800000050310050320000005055E3 -:10D99000500050434B0050535431202564005055E3 -:10D9A0005032000000000000000050524F00507242 -:10D9B0006F78695365743D25640050726F786952C1 -:10D9C0006567000000005374617274204779726FBC -:10D9D0002054656D70005374617274204661696CE7 -:10D9E0000000524C204558000000524C2564202570 -:10D9F0006420256420256420256400000000414C3B -:10DA0000204558000000414C2564202564202564F1 -:10DA100020256420256400000000000000000000B4 -:10DA200000000000000000000000000000000000F6 -:10DA30000000000000004779726F2054656D70206F -:10DA400053746F70000053746F70204661696C00EE -:10DA500000000000000000000000000000000000C6 -:10DA6000000000000000000000000000000000783E -:10DA700011001302F1EC560401BF0000800101C047 -:10DA800000010000EA86010D02F1EC5603000000DF -:10DA900001000000000000000000414620300000AE -:10DAA00000004146203100000000000000005354F7 -:10DAB000302D310000005354302D320000000000A2 -:10DAC00000000000000053542050726F783D256420 -:10DAD0000000000100005669656E6E61000041643F -:10DAE0006F6E69730000436865636B4C69676874A7 -:10DAF0004C757820496E6974000050443A496E5064 -:10DB00004654303932320000000000000000000CA2 -:10DB100035000000000C0000000045582050445221 -:10DB20004D4D204333202564000000000000414F8C -:10DB30002D5745000000414F500045582050445299 -:10DB40004D4D2043312025640000414420256420B0 -:10DB5000256420256420256400004779726F2054D5 -:10DB6000656D7020496E69740000524620310000D6 -:10DB70000000524620320000000000000000414337 -:10DB80002D574500000041434C00000000000000FC -:10DB90000000003B45001302F1EC560401C00000F8 -:10DBA000800101C100010000862A010D02F1EC563E -:10DBB0000300000001000000000000000000524DC2 -:10DBC00020256420256420256420256400000000B1 -:10DBD0000000000000004C757843000000006E61FA -:10DBE0006E004E414E00696E6600494E4600454942 -:10DBF000433220540000454943322D530000504425 -:10DC00003A2053746172745065646F000000455887 -:10DC1000205044524D4D204332202564000049528B -:10DC20004F45202564202564000049574520256480 -:10DC300020256400000049522025642C2564000042 -:10DC40000000000000004765737452656700534F81 -:10DC5000312030782578200000005445524D202591 -:10DC600064202564000050443A707420256400004C -:10DC70000000534D5241202564202564000000001F -:10DC8000000000061A8018000000000000000000DC -:10DC900000000000000000000000474620310000A6 -:10DCA0000000436C6F7365202564202564004F706D -:10DCB000656E2025642000C451001302F1EC560467 -:10DCC00001C10000800101C20001000013E1010D4B -:10DCD00002F1EC56030000000100256400004952E7 -:10DCE000452025642025640000004C4D43505320FE -:10DCF000312025640000474520435520256400005D -:10DD00000000496E69740000000053746F700000D9 -:10DD1000000053746172740000004A415254203272 -:10DD200000004558542D53000000686A6C747A4C0A -:10DD30000000542D455800000000000000000000C5 -:10DD40000000000000000000000000000000414949 -:10DD50004F0000000000414943005254432D53003E -:10DD60000000524620320000000015011401110588 -:10DD700024041401150104010506534144202564BF -:10DD80002000000000005052430053544D2D52001B -:10DD90000000000000000000000000000000000083 -:10DDA000000053544D2D4200000053544D2D4900A6 -:10DDB000000053544D2D4100000000000000474575 -:10DDC0004F000000000047454300000000005341A1 -:10DDD0004900000000000000000000456A00360213 -:10DDE000F1EC560401C20000800101C300010003F0 -:10DDF000000000001D000000000000000000000006 -:10DE0000000100000000000000000100000100000F -:10DE1000000000BC3300F902F1EC560300002000C2 -:10DE2000E000000E7000000E7000003B408001C357 -:10DE3000380000000800000E6800FFFF000000002E -:10DE4000000000000000000000FFFFFFC400000011 -:10DE50003CFFFFFFC40000003CFFFFFFC4000000C8 -:10DE60003CFFFFFFC40000003C0000000000000079 -:10DE700000000000000000000100000000000000A1 -:10DE8000000033F2FF00007070707000000506079C -:10DE900008090A0B0E0C0D00000853923C0001000B -:10DEA0000000000000000000000000000000000072 -:10DEB0000000000000000000000000000010000052 -:10DEC000003F6666663F4CCCCD00000000000000BD -:10DED000010000000100000001000000010000003E -:10DEE0000001010000003C000000010005000000EE -:10DEF0000000000100000000000000000000000021 -:10DF0000000401C30000800101C400010000B19BB6 -:10DF1000010D02F1EC5603000000010000000000BA -:10DF200000000000000000000000000000000000F1 -:10DF300000000000000000000000000000000000E1 -:10DF400000000000000000000000000000000000D1 -:10DF5000000000000000000000000000012C000094 -:10DF600000000000000000020000000400000006A5 -:10DF7000000000080000000A0000000C0000000E75 -:10DF80000000001000000012000000140000001744 -:10DF9000000000190000001B0000001D0000001F11 -:10DFA00000000021000000230000002500000027E1 -:10DFB000000000290000002B0000002D0000002FB1 -:10DFC0000000003100000033000000350000003781 -:10DFD000000000390000003B0000003D0000003F51 -:10DFE000000000410000004300000046000000481F -:10DFF0000000004A0000004C0000004E00000050ED -:10E0000000000052000000540000005600000058BC -:10E010000000005A0000005C0000005E00B2BA0080 -:10E020001302F1EC560401C40000800101C5000197 -:10E030000000D2CA010D02F1EC56030000000100FD -:10E040000000006000000062000000640000006644 -:10E05000000000680000006A0000006C0000006E14 -:10E0600000000070000000720000007400000076E4 -:10E07000000000780000007A0000007C0000007EB4 -:10E080000000008000000082000000840000008684 -:10E09000000000880000008A0000008C0000008E54 -:10E0A0000000009000000092000000940000009624 -:10E0B000000000980000009A0000009C0000009EF4 -:10E0C000000000A0000000A2000000A4000000A6C4 -:10E0D000000000A8000000AA000000AC000000AE94 -:10E0E000000000B0000000B2000000B4000000B664 -:10E0F000000000B8000000BA000000BC000000BE34 -:10E10000000000C0000000C2000000C4000000C603 -:10E11000000000C8000000CA000000CC000000CED3 -:10E12000000000D0000000D2000000D4000000D6A3 -:10E13000000000D8000000DA000000DC000000DE73 -:10E1400000671A001302F1EC560401C500008001BB -:10E1500001C6000100004701010D02F1EC56030069 -:10E1600000000100000000E0000000E2000000E408 -:10E17000000000E6000000E7000000E9000000EBFE -:10E18000000000ED000000EF000000F1000000F3CF -:10E19000000000F5000000F7000000F9000000FB9F -:10E1A000000000FD000000FF00000101000001036D -:10E1B0000000010400000106000001080000010A3F -:10E1C0000000010C0000010E00000110000001120F -:10E1D00000000114000001160000011800000119E0 -:10E1E0000000011B0000011D0000011F00000121B3 -:10E1F0000000012300000125000001270000012983 -:10E200000000012A0000012C0000012E0000013056 -:10E210000000013200000134000001360000013826 -:10E22000000001390000013B0000013D0000013FFA -:10E2300000000141000001430000014500000146CB -:10E24000000001480000014A0000014C0000014E9E -:10E250000000015000000151000001530000015571 -:10E26000000001570092A2001302F1EC560401C60F -:10E270000000800101C700010000F8BA010D02F1A1 -:10E28000EC56030000000100000001590000015B92 -:10E290000000015C0000015E0000016000000162FE -:10E2A00000000164000001650000016700000169D1 -:10E2B0000000016B0000016D0000016E00000170A4 -:10E2C0000000017200000174000001760000017777 -:10E2D000000001790000017B0000017D0000017F4A -:10E2E000000001800000018200000184000001861E -:10E2F00000000187000001890000018B0000018DF2 -:10E300000000018E000001900000019200000194C5 -:10E310000000019500000197000001990000019B99 -:10E320000000019C0000019E000001A0000001A26D -:10E33000000001A3000001A5000001A7000001A842 -:10E34000000001AA000001AC000001AE000001AF16 -:10E35000000001B1000001B3000001B4000001B6EB -:10E36000000001B8000001B9000001BB000001BDC0 -:10E37000000001BF000001C0000001C2000001C494 -:10E38000000001C5000001C700B47C001302F1ECDD -:10E39000560401C70000800101C8000100006F5150 -:10E3A000010D02F1EC56030000000100000001C95C -:10E3B000000001CA000001CC000001CE000001CF26 -:10E3C000000001D1000001D3000001D4000001D6FB -:10E3D000000001D7000001D9000001DB000001DCD2 -:10E3E000000001DE000001E0000001E1000001E3A7 -:10E3F000000001E5000001E6000001E8000001E97D -:10E40000000001EB000001ED000001EE000001F052 -:10E41000000001F1000001F3000001F5000001F629 -:10E42000000001F8000001F9000001FB000001FDFF -:10E43000000001FE000002000000020100000203D3 -:10E4400000000204000002060000020800000209A9 -:10E450000000020B0000020C0000020E0000020F80 -:10E460000000021100000213000002140000021656 -:10E4700000000217000002190000021A0000021C2E -:10E480000000021D0000021F000002200000022206 -:10E4900000000223000002250000022600000228DE -:10E4A000000002290000022B0000022C00DC1500F5 -:10E4B0001302F1EC560401C80000800101C90001FB -:10E4C00000002FEA010D02F1EC56030000000100EC -:10E4D0000000022E0000022F000002310000023274 -:10E4E000000002340000023500000237000002384C -:10E4F0000000023A0000023B0000023D0000023E24 -:10E5000000000240000002410000024300000244FB -:10E510000000024600000247000002480000024AD4 -:10E520000000024B0000024D0000024E00000250AD -:10E530000000025100000253000002540000025586 -:10E5400000000257000002580000025A0000025B5F -:10E550000000025C0000025E0000025F0000026139 -:10E560000000026200000264000002650000026612 -:10E5700000000268000002690000026A0000026CEC -:10E580000000026D0000026F0000027000000271C6 -:10E5900000000273000002740000027500000277A0 -:10E5A000000002780000027A0000027B0000027C7A -:10E5B0000000027E0000027F000002800000028254 -:10E5C000000002830000028400000286000002872F -:10E5D00000C5DF001302F1EC560401C90000800100 -:10E5E00001CA00010000BA21010D02F1EC5603003E -:10E5F00000000100000002880000028A0000028B77 -:10E600000000028C0000028E0000028F00000290C9 -:10E6100000000292000002930000029400000296A3 -:10E620000000029700000298000002990000029B7F -:10E630000000029C0000029D0000029F000002A05A -:10E64000000002A1000002A2000002A4000002A536 -:10E65000000002A6000002A8000002A9000002AA11 -:10E66000000002AB000002AD000002AE000002AFED -:10E67000000002B0000002B2000002B3000002B4C9 -:10E68000000002B5000002B7000002B8000002B9A5 -:10E69000000002BA000002BC000002BD000002BE81 -:10E6A000000002BF000002C1000002C2000002C35D -:10E6B000000002C4000002C5000002C7000002C83A -:10E6C000000002C9000002CA000002CB000002CD17 -:10E6D000000002CE000002CF000002D0000002D1F4 -:10E6E000000002D3000002D4000002D5000002D6D0 -:10E6F000000002D700C602001302F1EC560401CA62 -:10E700000000800101CB00010000059A010D02F11B -:10E71000EC56030000000100000002D8000002DAFD -:10E72000000002DB000002DC000002DD000002DE6F -:10E73000000002E0000002E1000002E2000002E34B -:10E74000000002E4000002E5000002E6000002E82A -:10E75000000002E9000002EA000002EB000002EC07 -:10E76000000002ED000002EE000002F0000002F1E5 -:10E77000000002F2000002F3000002F4000002F5C3 -:10E78000000002F6000002F7000002F8000002FAA2 -:10E79000000002FB000002FC000002FD000002FE7F -:10E7A000000002FF0000030000000301000003025C -:10E7B0000000030300000305000003060000030738 -:10E7C00000000308000003090000030A0000030B17 -:10E7D0000000030C0000030D0000030E0000030FF7 -:10E7E00000000310000003110000031300000314D5 -:10E7F00000000315000003160000031700000318B3 -:10E80000000003190000031A0000031B0000031C92 -:10E810000000031D0000031E00CDC7001302F1EC31 -:10E82000560401CB0000800101CC0001000011B2B0 -:10E83000010D02F1EC560300000001000000031F6F -:10E840000000032000000321000003220000032336 -:10E850000000032400000000000000000000000091 -:10E8600000000000000000000000000000000000A8 -:10E870000000000000000000000000000000000098 -:10E880000000000000000000000000000000000088 -:10E890000000000000000000000000000000000078 -:10E8A0000000000000000000000000000000000068 -:10E8B0000000000000000000000000000000000058 -:10E8C0000000000000000000000000000000000048 -:10E8D0000000000000000000000000000000000038 -:10E8E0000000000000000000000000000000000028 -:10E8F0000000000000000000000000000000000018 -:10E900000000000000000000000000000000000007 -:10E9100000000000000000000000000000000000F7 -:10E9200000000000000000000000000100010000E5 -:10E9300000000000000000000000000000E467008C -:10E940001302F1EC560401CC0000800101CD00015E -:10E9500000007B0A010D02F1EC56030000000100EB -:10E9600000000000000000000000000000000001A6 -:10E970000000000000000000000000000000000097 -:10E980000000000000000000000000000000000087 -:10E990000000000000000000000000000000000077 -:10E9A0000000000000000000000000000000000067 -:10E9B0000000000000000000000000000000000057 -:10E9C0000000000000000000000000000000000047 -:10E9D0000000000000000000000000000000000037 -:10E9E0000000000000000000000000000000000027 -:10E9F0000000000000000000000000000000000017 -:10EA00000000000000000000000000000000000006 -:10EA100000000000000000000000000000000000F6 -:10EA200000000002000200000000000000000000E2 -:10EA300000000000000000000000000000000000D6 -:10EA400000000001000000020000000000000000C3 -:10EA5000000000000000000000000047000000006F -:10EA6000005C8F001302F1EC560401CD0000800120 -:10EA700001CE00010000EEC1010D02F1EC560300D1 -:10EA80000000010000000000000000000000000184 -:10EA90000000001000000000000000000000000066 -:10EAA000000000000000000000000001000000C89D -:10EAB0000000000400000000000000000000000052 -:10EAC0000000000000000000000000000000000046 -:10EAD0000000000000000000000000000000000036 -:10EAE0000000000000000000000000000000000026 -:10EAF0000000000000000000000000000000000016 -:10EB00000000000000000000000000000000000005 -:10EB100000000000000000000000000300000000F2 -:10EB200000000000000000000000000000000000E5 -:10EB300000000000000000000000000000000000D5 -:10EB400000000000000000000000000000000000C5 -:10EB500000000000000000000000000000000000B5 -:10EB600000000000000000000000000000000000A5 -:10EB70000000000000000000000000000000000095 -:10EB8000000000000020DD001302F1EC560401CE6D -:10EB90000000800101CF00010000517A010D02F157 -:10EBA000EC5603000000010000000000000000001F -:10EBB0000000000000000000000000000000000055 -:10EBC0000000000000000000000000000000000045 -:10EBD0000000000000000000000000000000000035 -:10EBE0000000000000000000000000000000000025 -:10EBF0000000000000000000000000000000000015 -:10EC00000000000000000000000000000000000004 -:10EC100000000000000000000000000000000000F4 -:10EC200000000000000000000000000001000000E3 -:10EC300000000001010000000000000200000000D0 -:10EC400000000000000000000000000001000000C3 -:10EC500000000002000000000000000000000000B2 -:10EC600000000000000000000000000001000000A3 -:10EC700000000000000000003FC999999999999AF5 -:10EC80003FE33333333333333FE999999999999A71 -:10EC90003FF333333333333340033333333333339B -:10ECA0003FE333333333333300254E001302F1ECAB -:10ECB000560401CF0000800101D000010000411284 -:10ECC000010D02F1EC5603000000010000000000FD -:10ECD0000000000000000000000000000000000034 -:10ECE000000000000000000A00000007000000070C -:10ECF00000000005000000140000020000000001F8 -:10ED000000000001E0071F000000000000000002FA -:10ED10000000000000000000609C7866805DEFC885 -:10ED200031FF0000800146D8000000000300000011 -:10ED300000000000000000000000000000000000D3 -:10ED400000000000000000000000000000000000C3 -:10ED500000000000000000000000000000000000B3 -:10ED600000000000000000000000000000000D7422 -:10ED70000000000000000000000000000000000093 -:10ED80000000000000000000000000000000000083 -:10ED90000000000000000000000000000000000073 -:10EDA0000000000000000000000000000000000063 -:10EDB0000000000000000000000000000000000053 -:10EDC000000000000000000000000000001C160110 -:10EDD0000D02F1EC560401D00000800101D10001C8 -:10EDE000000300000000A000000000000000000080 -:10EDF0000000000000000000000000000000000013 -:10EE00000000000000000000000000000000000002 -:10EE100000000000000000000000000000000000F2 -:10EE200000000000000000000000000000000000E2 -:10EE300000000000000000000000000000000000D2 -:10EE400000000000000000000000000000000000C2 -:10EE500000000000000000000000000000000000B2 -:10EE600000000000000000000000000000000000A2 -:10EE70000000000000000000000000000000000092 -:10EE8000000000000000000401D10000800101D258 -:10EE90000001000101D30001000101D400010001C3 -:10EEA00001D50001000101D60001000101D70001D8 -:10EEB000000101D80001000101D90001000101DABF -:10EEC0000001000101DB0001000101DC0001000183 -:10EED00001DD0001000101DE00010000632700E305 -:10EEE00002F1EC560101DF0001000101E000010028 -:10EEF0000101E10001000101E20001000101E30064 -:10EF000001000101E40001000101E500010001012F -:10EF1000E60001000101E70001000101E800010035 -:10EF20000101E90001000101EA0001000101EB001B -:10EF300001000101EC0001000101ED0001000101EF -:10EF4000EE0001000101EF0001000101F0000100ED -:10EF50000101F10001000101F20001000101F300D3 -:10EF600001000101F40001000101F50001000101AF -:10EF7000F60001000101F70001000101F8000100A5 -:10EF80000101F90001000101FA0001000101FB008B -:10EF900001000101FC0001000101FD00010001016F -:10EFA000FE0001000101FF000100030000FC00045D -:10EFB0008A8833BF0401FF00008007000686250F02 -:03EFC000000D340D -:00000001FF +:10000000000D02F1EC5601002000010000E7F901AB +:100010000D02F1EC56030000000100482D483FD7C7 +:10002000030000000080008001B540EBCD40E018E7 +:100030009730565907C235E06535B4EA150000ED32 +:10004000B70000C0C2301CAADCAAEC30CCAAFC0A63 +:100050009C2F8CE0A0AADA18962F8630CCE0A0AABC +:100060005BFE360005EB5601F45C86F9D6B010A9AC +:100070004CAA8CAA96AAA7AABCAAC6E3CF90E080F5 +:100080000175EC800174F8D401E0A026A1E06B2694 +:100090001CEA1B00002B0C198CB68C169CD802E0B5 +:1000A0006C261CEA1C0000E06B00D5B88BE06B00EE +:1000B000CEB89B360BB8AB5EFC0000EBCD40801891 +:1000C000975807C031E3CF8080E0A0CCCB300BC085 +:1000D00098EE0B070AF80B00092829B28A2FFB5C5F +:1000E0005B584BCF75E3CF90800000EBCD40E02014 +:1000F0001D1896300CBA8CE0A0CCB4189530075877 +:1001000006C031300CC1E8E0A026622C0C988CEDC2 +:10011000BC0005C033301CC1580D8C0045310013A4 +:1001200002F1EC56040020000080010021000100D3 +:1001300000CB7A010D02F1EC56030000000100EB48 +:100140006C00820D9CEB6C0083301B1A9CE06A38BB +:1001500028EA1A0000745A74BA746A5D1AC0203012 +:10016000170E9C5C5C2FFDE3CD80E0EBCD40802042 +:100170001D300BBA8B198CBA8CE06C3828EA1C0045 +:100180000078476EBC782C5D1CC031300CC0D83074 +:100190001A1A9B305C6EB972895D19CF806EBC787B +:1001A0001C5D1CCF40301C2FFDE3CD80800000EB98 +:1001B000CD408018975807C031E3CF8080E0A0CCB5 +:1001C000630F8BF96B0084F93C0084580CC06032DB +:1001D0002CE0A029AFE3CF9080E06B3828EA1B0029 +:1001E00000765C199A768C199C180A764C199C1822 +:1001F0000A5C5AC041322CE0A029ACE3CF90808049 +:100200000074F080007510D401E0A025F3E06B26A7 +:100210001CEA1B0000F91A0040A94AB68A2C0C9867 +:100220008CB69C169CD802D631300730063005308B +:10023000043003E06037ADEA100000300CA08C0001 +:100240007501001302F1EC5604002100008001004A +:1002500022000100005EB1010D02F1EC5603000026 +:10026000000100E0A0CC221892FB2C0007E0A05770 +:100270003FC080E06C00C8C6CC3C8CA08C3C87C3DF +:1002800038CA5CC0213016FB2C0007E0A06BEE18CA +:1002900091E5610064E51C005E580CC060FB2C0019 +:1002A00007E0A0B3F71893658C580CC060FB2C00D6 +:1002B00007E0A05735189529A2848C580CC040E05F +:1002C000A062B618945C61C0915C64C0715C65C04A +:1002D000515C66C0315C63C070E06C00C4C39C3C80 +:1002E000473C4CA08C0E9C5C6CDC328000D088803B +:1002F00000FA0480018A2C8000D0B88000E7C8EBA7 +:10030000CD4080E0A0CBD21897EF1C005E580CC007 +:1003100030E0A0572F6F8C580CC030E0A0572A292E +:10032000A78E8C580CC030E0A062A2E0A026D4E3D7 +:10033000CF80808000D10C8000E80880007070E0E1 +:100340006B37AAEA1B0000F72C00005EFC0000E0FF +:100350006B37ABEA1B0000E04C00CFC071178AF48A +:1003600009151800A8FF001302F1EC560400220042 +:10037000008001002300010000E10A010D02F1EC00 +:1003800056030000000100C030B69AC038300AB6EB +:100390009AB68C5EFD0000E06C37ABEA1C000019D9 +:1003A0008C5EFCD401E0A00B3DCBDFD80A0000EB53 +:1003B000CD40C0E067261CEA1700003006EF66005B +:1003C000FCE0A006E1C071AE96E06C00C4AE8CEF1C +:1003D0006600FCEF6600FDEF6600FEEF660100EFD1 +:1003E0006600FFEF6601010E9CE3CD80C00000E0D7 +:1003F0006C261CEA1C0000F93B00FD580B5E1DF941 +:100400003B0100580B5E1DF93B00FF580B5E1DF9C8 +:100410003B0101580B5E1DF93C00FE580C5E1D5E51 +:10042000FF0000EBCD40F8201D189616975806C027 +:1004300040EE0C1518C041300CE08F06A13005C10C +:1004400038E60C000B17CBE93A00FCE80A0B0BE985 +:100450003B00FC2FFBE96B00FC2FFC5C6C581CCFB5 +:10046000152FF55C650E35E0840689EA0310680CEB +:1004700003E064261CEA140000078CE93B00FCE85A +:100480000B0B0CE93C00FC0040F7001302F1EC56AA +:1004900004002300008001002400010000F5220177 +:1004A0000D02F1EC560300000001002FFCE96C0086 +:1004B000FC078C585CF9BC0205FE0C001C984C181B +:1004C0000F000E04B60B80047803DAFF9C07ACE93A +:1004D0003B00FCE80B0B0CE93C00FC2FFCE96C003A +:1004E000FC07AC589CF9BC02092FECFE0C001FC0A5 +:1004F000A8C498C888CC78CFC8C249C989C379C86C +:10050000B9CADB862CA94CE93B00FCE80B0B0CE9D3 +:100510003C00FC2FFCE96C00FC862CE93B00FCE86D +:100520000B0B0CE93C00FC2FFCE96C00FC863CA9A1 +:100530004CE93B00FCE80B0B0CE93C00FC2FFCE910 +:100540006C00FC863CE93B00FCE80B0B0CE93C0032 +:10055000FC2FFCE96C00FC864CA94CE93B00FCE854 +:100560000B0B0CE93C00FC2FFCE96C00FC864CE911 +:100570003B00FCE80B0B0CE93C00FC2FFCE96C0099 +:10058000FCC82B862CA94CE93B00FCE80B0B0CE9C2 +:100590003C00FC2FFCE96C00FC862CE93B00FCE8ED +:1005A0000B0B0CE93C00FC2FFCE96C0097290013B5 +:1005B00002F1EC5604002400008001002500010037 +:1005C000009F9A010D02F1EC5603000000010000AB +:1005D000FC863CA94CE93B00FCE80B0B0CE93C0019 +:1005E000FC2FFCE96C00FC863CE93B00FCE80B0BB3 +:1005F0000CE93C00FC2FFCE96C00FC864CA94CE9A2 +:100600003B00FCE80B0B0CE93C00FC2FFCE96C0008 +:10061000FC864CE93B00FCE80B0B0CE93C00FC2F92 +:10062000FCE96C00FCC42B862CA94CE93B00FCE8DF +:100630000B0B0CE93C00FC2FFCE96C00FC862CE960 +:100640003B00FCE80B0B0CE93C00FC2FFCE96C00C8 +:10065000FC863CA94CE93B00FCE80B0B0CE93C0098 +:10066000FC2FFCE96C00FC863CE93B00FCE80B0B32 +:100670000CE93C00FC2FFCE96C00FC864CA94CE921 +:100680003B00FCE80B0B0CE93C00FC2FFCE96C0088 +:10069000FC864CE93B00FCE80B0B0CE93C00FC2F12 +:1006A000FCE96C00FCC02B661CB14CE93B00FCE88B +:1006B0000B0B0CE93C00FC2FFCE96C00FC661CA950 +:1006C0004CE93B00FCE80B0B0CE93C00FC2FFC0068 +:1006D000B527001302F1EC5604002500008001004C +:1006E00026000100000A51010D02F1EC5603000042 +:1006F000000100E96C00FC661CE93B00FCE80B0B08 +:100700000CE93C00FC2FFCE96C00FC864CA94CE990 +:100710003B00FCE80B0B0CE93C00FC2FFCE96C00F7 +:10072000FC864CE93B00FCE80B0B0CE93C00FC2F81 +:10073000FCE96C00FCCCCA862CE93B00FCE80B0B06 +:100740000CE93C00FC2FFCE96C00FC863CE93B001A +:10075000FCE80B0B0CE93C00FC2FFCE96C00FC8670 +:100760004CE93B00FCE80B0B0CE93C00FC2FFCE9DE +:100770006C00FC865CE93B00FCE80B0B0CE93C00E0 +:10078000FC2FFCE96C00FCCA3A07CCE93B00FCE812 +:100790000B0B0CE93C00FC2FFCE96C00FC07DCE9CE +:1007A0003B00FCE80B0B0CE93C00FC2FFCE96C0067 +:1007B000FCC8EA862CA94CE93B00FCE80B0B0CE9D1 +:1007C0003C00FC2FFCE96C00FC862CE93B00FCE8BB +:1007D0000B0B0CE93C00FC2FFCE96C00FC863CA9EF +:1007E0004CE93B00FCE80B0B0CE93C00FC2FFCE95E +:1007F0006C00FC00BD37001302F1EC56040026002B +:10080000008001002700010000B5EA010D02F1ECB3 +:1008100056030000000100863CE93B00FCE80B0B9E +:100820000CE93C00FC2FFCE96C00FC864CA94CE96F +:100830003B00FCE80B0B0CE93C00FC2FFCE96C00D6 +:10084000FC864CE93B00FCE80B0B0CE93C00FC2F60 +:10085000FCE96C00FC865CA94CE93B00FCE80B0B56 +:100860000CE93C00FC2FFCE96C00FC865CE93B00D9 +:10087000FCE80B0B0CE93C00FC2FFCE96C00FCC312 +:100880009A07CCE93B00FCE80B0B0CE93C00FC2F81 +:10089000FCE96C00FCC2EA862CA94CE93B00FCE8B0 +:1008A0000B0B0CE93C00FC2FFCE96C00FC862CE9EE +:1008B0003B00FCE80B0B0CE93C00FC2FFCE96C0056 +:1008C000FC863CA94CE93B00FCE80B0B0CE93C0026 +:1008D000FC2FFCE96C00FC863CE93B00FCE80B0BC0 +:1008E0000CE93C00FC2FFCE96C00FC2F83078CE931 +:1008F0003B00FCE80B0B0CE93C00FC2FFCE96C0016 +:10090000FCFE9FFDF8E93C00FC080C300BF96BFF86 +:10091000FF07ABB88BE93C002238001302F1EC561C +:1009200004002700008001002800010000220101CE +:100930000D02F1EC5603000000010000FC2FFCE961 +:100940006C00FC07AC20ACFE93FDD2202CC043C051 +:10095000F0FE9FFDCD07CCE93B00FCE80B0B0CE95A +:100960003C00FC2FFCE96C00FCFE9FFDD6661CB928 +:100970008CE93B00FCE80B0B0CE93C00FC2FFCE98C +:100980006C00FC661CB18CE93B00FCE80B0B0CE92D +:100990003C00FC2FFCE96C00FC661CA98CE93B00C8 +:1009A000FCE80B0B0CE93C00FC2FFCE96C00FC663E +:1009B0001CE93B00FCE80B0B0CE93C00FC2FFCE9BC +:1009C0006C00FCFE9FFDA907ACE93B00FCE80B0BAB +:1009D0000CE93C00FC2FFCE96C00FC07AC069B2FEB +:1009E000CBE93A00FC080A1498580CC0501739207B +:1009F0001C10C9CFD107ACE93B00FC180BE96B0018 +:100A0000FCFE9FFD8A079C581CC050079C583CE088 +:100A10008102DE079C581CC0C1301CE93B00FCE889 +:100A20000B0B0CE93C00FC2FFCE96C00FCC0E80758 +:100A30009C583CC0B1303CE93B00FC00FCB10013C9 +:100A400002F1EC560400280000800100290001009A +:100A50000062BA010D02F1EC56030000000100E84B +:100A60000B0B0CE93C00FC2FFCE96C00FC07AC20F4 +:100A70002C5C5C597CF9BC0202FE0C001C984C18E2 +:100A80000F04720030FA900472047204720472044B +:100A90007204720472049E0472047204720472FA84 +:100AA00090FA90FA90FA90FA90FA90047204720711 +:100AB000ACE93B00FCE80B0B0CE93C00FC2FFCE92B +:100AC0006C00FC079C583CC13107CCE93B00FCE8BA +:100AD0000B0B0CE93C00FC2FFCE96C00FC07CC5034 +:100AE0000CE06CCF94EA1C8001E0A0232F07DCE926 +:100AF0003B00FCE80B0B0CE93C00FC2FFCE96C0014 +:100B0000FCE93C00FC080C07DBEDBB0007E08300C0 +:100B10009BE73B0008B88BE93C00FC2FFCE96C002C +:100B2000FCE73C0009E93B00FCE80B0B0CE93C004E +:100B3000FC2FFCE96C00FC300CE93B00FCE80B0BE3 +:100B40000CE93C00FC2FFCE96C00FCE73C000AE9E6 +:100B50003B00FCE80B0B0CE93C00FC2FFCE96C00B3 +:100B60000630001302F1EC56040029000080010059 +:100B70002A00010000F771010D02F1EC560300009C +:100B800000010000FCE71C0012A94CE93B00FCE856 +:100B90000B0B0CE93C00FC2FFCE96C00FCE71C0093 +:100BA00012E93B00FCE80B0B0CE93C00FC2FFCE9D4 +:100BB0006C00FCE73C0014E93B00FCE80B0B0CE983 +:100BC0003C00FC2FFCE96C00FCE73C0015E93B0015 +:100BD000FCE80B0B0CE93C00FC2FFCE96C00FCE78B +:100BE0003C0016E93B00FCE80B0B0CE93C00FC2F39 +:100BF000FCE96C00FCE73C0017E93B00FCE80B0B50 +:100C00000CE93C00FC2FFCE96C00FCE73C000BE924 +:100C10003B00FCE80B0B0CE93C00FC2FFCE96C00F2 +:100C2000FCE73C000CE93B00FCE80B0B0CE93C004A +:100C3000FC2FFCE96C00FCE73C000DE93B00FCE804 +:100C40000B0B0CE93C00FC2FFCE96C00FC2F23078C +:100C50008CE93B00FCE80B0B0CE93C00FC2FFCE9A9 +:100C60006C00FCFE9FFC7D662BB18BB88BE93C00D1 +:100C7000FC2FFCE96C00FC662CA98CE93B00FCE82D +:100C80000B0B0C00AEA9001302F1EC5604002A0075 +:100C9000008001002B0001000048CA010D02F1ECA8 +:100CA00056030000000100E93C00FC2FFCE96C0049 +:100CB000FC662CE93B00FCE80B0B0CE93C00FC2F2C +:100CC000FCE96C00FC663CB18CE93B00FCE80B0BDA +:100CD0000CE93C00FC2FFCE96C00FC663CA98CE9AB +:100CE0003B00FCE80B0B0CE93C00FC2FFCE96C0022 +:100CF000FC663CE93B00FCE80B0B0CE93C00FC2FDC +:100D0000FCE96C00FC664CB18CE93B00FCE80B0B89 +:100D10000CE93C00FC2FFCE96C00FC664CA98CE95A +:100D20003B00FCE80B0B0CE93C00FC2FFCE96C00E1 +:100D3000FC664CE93B00FCE80B0B0CE93C00FC2F8B +:100D4000FCE96C00FC665CB18CE93B00FCE80B0B39 +:100D50000CE93C00FC2FFCE96C00FC665CA98CE90A +:100D60003B00FCE80B0B0CE93C00FC2FFCE96C00A1 +:100D7000FC665CE93B00FCE80B0B0CE93C00FC2F3B +:100D8000FCE96C00FC66BCB18CE93B00FCE80B0B99 +:100D90000CE93C00FC2FFCE96C00FC66BCA98CE96A +:100DA0003B00FCE80B0B0C009053001302F1EC56D7 +:100DB00004002B00008001002C000100005CE20117 +:100DC0000D02F1EC56030000000100E93C00FC2F8D +:100DD000FCE96C00FC66BCE93B00FCE80B0B0CE991 +:100DE0003C00FC2FFCE96C00FCE73C0030E93B00D8 +:100DF000FCE80B0B0CE93C00FC2FFCE96C00FCE769 +:100E00003C0031E93B00FCE80B0B0CE93C00FC2FFB +:100E1000FCE96C00FCE71C0032A94CE93B00FCE853 +:100E20000B0B0CE93C00FC2FFCE96C00FCE71C0000 +:100E300032E93B00FCE80B0B0CE93C00FC2FFCE921 +:100E40006C00FCE73C0034E93B00FCE80B0B0CE9D0 +:100E50003C00FC2FFCE96C00FC666CB18CE93B00AB +:100E6000FCE80B0B0CE93C00FC2FFCE96C00FC6679 +:100E70006CA98CE93B00FCE80B0B0CE93C00FC2F57 +:100E8000FCE96C00FC666CE93B00FCE80B0B0CE930 +:100E90003C00FC2FFCE96C00FC667CB18CE93B005B +:100EA000FCE80B0B0CE93C00FC2FFCE96C00FC6639 +:100EB0007CA98CE93B00FCE80B0B0CE93C00FC2F07 +:100EC000FCE96C00FC667CE93B00FC00A0230013FD +:100ED00002F1EC5604002C00008001002D000100FE +:100EE00000365A010D02F1EC56030000000100E843 +:100EF0000B0B0CE93C00FC2FFCE96C00FC668CB190 +:100F00008CE93B00FCE80B0B0CE93C00FC2FFCE9F6 +:100F10006C00FC668CA98CE93B00FCE80B0B0CE92F +:100F20003C00FC2FFCE96C00FC668CE93B00FCE813 +:100F30000B0B0CE93C00FC2FFCE96C00FC669CB13F +:100F40008CE93B00FCE80B0B0CE93C00FC2FFCE9B6 +:100F50006C00FC669CA98CE93B00FCE80B0B0CE9DF +:100F60003C00FC2FFCE96C00FC669CE93B00FCE8C3 +:100F70000B0B0CE93C00FC2FFCE96C00FCFE9FFB1A +:100F80002607ACE93B00FCE80B0B0CE93C00FC2F0E +:100F9000FCE96C00FC07CCE93B00FCE80B0B0CE91E +:100FA0003C00FC2FFCE96C00FCFE9FFB1007ACE949 +:100FB0003B00FCE80B0B0CE93C00FC2FFCE96C004F +:100FC000FC07CCE93B00FCE80B0B0CE93C00FC2FD8 +:100FD000FCE96C00FC07DCE93B00FCE80B0B0CE9CE +:100FE0003C00FC2FFCE96C00FC07ECE93B00FC003A +:100FF000F37A001302F1EC5604002D00008001008A +:101000002E00010000A391010D02F1EC5603000037 +:10101000000100E80B0B0CE93C00FC2FFCE96C0024 +:10102000FC864CA94CE93B00FCE80B0B0CE93C00AE +:10103000FC2FFCE96C00FC864CE93B00FCE80B0B48 +:101040000CE93C00FC2FFCE96C00FC865CA94CE937 +:101050003B00FCE80B0B0CE93C00FC2FFCE96C00AE +:10106000FC865CE93B00FCE80B0B0CE93C00FC2F28 +:10107000FCE96C00FC866CA94CE93B00FCE80B0B1E +:101080000CE93C00FC2FFCE96C00FC866CE93B00A1 +:10109000FCE80B0B0CE93C00FC2FFCE96C00FCFEAF +:1010A0009FFAA7079C582CC4E1302CE93B00FCE8D0 +:1010B0000B0B0CE93C00FC2FFCE96C00FC07AC5866 +:1010C0004CFE91FA8107ACE93B00FCE80B0B0CE904 +:1010D0003C00FC2FFCE96C00FC07CCE93B00FCE881 +:1010E0000B0B0CE93C00FC2FFCE96C00FC07DCE975 +:1010F0003B00FCE80B0B0CE93C00FC2FFCE96C000E +:10110000FC07ECE93B00FCE80B0B0CE93C00FC2F76 +:10111000FCE96C00A495001302F1EC5604002E00CB +:10112000008001002F000100001C2A010D02F1ECDB +:101130005603000000010000FC07FCE93B00FCE84E +:101140000B0B0CE93C00FC2FFCE96C00FC2F830727 +:101150008CE93B00FCE80B0B0CE93C00FC2FFCE9A4 +:101160006C00FCFE9FFA57079C583CFE91FA3E30FB +:101170003CE93B00FCE80B0B0CE93C00FC2FFCE9D4 +:101180006C00FC07AC589CFE91FA3007ACE93B00C0 +:10119000FCE80B0B0CE93C00FC2FFCE96C00FC07A5 +:1011A000CCE93B00FCE80B0B0CE93C00FC2FFCE914 +:1011B0006C00FC07DCE93B00FCE80B0B0CE93C0095 +:1011C000FC2FFCE96C00FCFE9FFA25300C07ABE914 +:1011D0003A00FCE80A0B0BE93B00FC2FFBE96B0033 +:1011E000FC07AB58ABF9BB0203FE0B001B964B167A +:1011F0000F0016003A0060F3F8008400A800CC004D +:10120000F00114F41C5C6C581CFE94FA04E60C000B +:101210000B17CBE93A00FCE80A0B0BE93B00FC2F6B +:10122000FBE96B00FC2FFCCEFB5C6CE04C0022FE6B +:1012300094F9F1E60C000B000B80001302F1EC5660 +:1012400004002F000080010030000100000C42016A +:101250000D02F1EC5603000000010017CBE93A0043 +:10126000FCE80A0B0BE93B00FC2FFBE96B00FC2FB1 +:10127000FCCEEB5C6C586CFE94F9DFE60C000B17AF +:10128000CBE93A00FCE80A0B0BE93B00FC2FFBE939 +:101290006B00FC2FFCCEFB5C6C581CFE94F9CDE679 +:1012A0000C000B17CBE93A00FCE80A0B0BE93B00FA +:1012B000FC2FFBE96B00FC2FFCCEFB5C6C585CFE4A +:1012C00094F9BBE60C000B17CBE93A00FCE80A0BDB +:1012D0000BE93B00FC2FFBE96B00FC2FFCCEFB5C19 +:1012E0006C581CFE94F9A9E60C000B17CBE93A00E8 +:1012F000FCE80A0B0BE93B00FC2FFBE96B00FC2F21 +:10130000FCCEFB5C6C581CFE94F997E60C000B17A6 +:10131000CBE93A00FCE80A0B0BE93B00FC2FFBE9A8 +:101320006B00FC2FFCCEFB5C6CE04C0038FE94F9AB +:1013300084E60C000B17CBE93A00FCE80A0B0BE93A +:101340003B00FC2FFBE96B00FC2FFCCEEB301C2F8D +:10135000FDE3CD80F80000EBCD40E000D8B50013F0 +:1013600002F1EC5604003000008001003100010061 +:101370000018FF010D02F1EC56030000000100E02F +:1013800067261CEA170000302CEF6C00FCE0662892 +:10139000B4EA160000EF3B00FD0C9C298CFEB0F96E +:1013A0003F1895EF3B00FE0C9CFE3CF9E8FEB0F9BF +:1013B000371845EF3B01000C9CFEB0F9311845EFA2 +:1013C0003B00FF0C9CFE3CF778FEB0F9291845EF76 +:1013D0003B0101FE36F7100C9CFEB0F92118455870 +:1013E00015C0F1EF3C00FCFE3CFF02EF6C00FCEF8F +:1013F0003C00FCAE9CE06C00C4AE8CE3CF90E030CF +:101400000CEF6C00FCE3CF80E00000E06C35B4EA48 +:101410001C0000E06B00C8B88B311BB89B5EFCD48D +:1014200001FEB0F737E06C35B4EA1C0000D802309A +:101430000CE06B35B4EA1B0000F75C01F45EFFEBD7 +:10144000CD4080201D1A9B300AB68AB69AB6AA599A +:101450000CC065CE6F1897CECF0E9CC1C8581CC16A +:10146000911A9CE0A0C390E06C261CEA1C00001BB3 +:101470008BB8DB1B9BB8EB1BABB8FB304BF96B009D +:10148000C2FA001302F1EC560400310000800100A2 +:1014900032000100008D34010D02F1EC5603000012 +:1014A00000010000FC300AB88AB89B3019B8A9B80E +:1014B000BAB8CBC028300C2FFDE3CD8080D7038095 +:1014C00001B904D431217D189716905807C040E027 +:1014D0000C1518C041300CE08F038CE0A01DBC51EE +:1014E0006C30023006FB560054FB66002D30A5FB25 +:1014F00065002EFB660030FB660031E06128B0EA33 +:10150000110000A2863004C068A2963012038C2F0E +:10151000FCA28CE0041800E082036A5C54EE04072D +:101520000CE0632720EA130000038BF6091028065D +:1015300009B28C2FF4E04C00A1C4A15C54EE040766 +:101540000CB29C2FF45C54EE04070CB2CC2FF45C6C +:1015500054EE04070CB2DC2FF4139C58ACC0B51A3F +:101560009C328A130B18AB204ACFD1E0A0A81618E2 +:1015700092CCEB300A13CB5C6B139C5C6CE0A09AB2 +:10158000231892038CF80C10281803079C585CCB86 +:10159000F1300CFB6C002C311CFB6C002DFACCFFE5 +:1015A000D02FC300AFDC001302F1EC560400320070 +:1015B000008001003300010000328F010D02F1ECC8 +:1015C00056030000000100324A070B18AB204ACF37 +:1015D000D1FB65002EFB560054FACCFFD41A9B3287 +:1015E000C9190A16AA2049CFD1E0A0914F1892CA72 +:1015F0001BE04C00A2C4B15C54EE04070CB29C2F5B +:10160000F45C54EE04070CB2CC2FF45C54EE0407E7 +:101610000CB2DC2FF4139C58ACC0B51A9C328A1360 +:101620000B18AB204ACFD1E0A0A8401892C82B30AD +:101630000A13CB5C6B139C5C6CE0A09A2918920394 +:101640008CF80C10281803079C585CFE91FF73302F +:101650001CFB6C002C311CFB6C002DFACCFFD02F36 +:10166000C3324A070B18AB204ACFD1FB65002EFBD3 +:10167000560054FACCFFD41A9B32C9190A16AA2074 +:1016800049CFD1E0A091021892C54BE04C00A4C113 +:10169000E15C54EE04070CB29C2FF45C54EE04079A +:1016A0000CB2CC2FF45C54EE04070CB2DC2FF41314 +:1016B0009C58ACC0353012C3DB300A13CB5C6B13C3 +:1016C0009C5C6CE0A09A3600FC22001302F1EC5600 +:1016D0000400330000800100340001000026A7014F +:1016E0000D02F1EC560300000001001892C34BE01C +:1016F0004C00A8C2815C54EE04070CB29C2FF45C31 +:1017000054EE04070CB2CC2FF45C54EE04070CB278 +:10171000DC2FF4139C500CE06CD0C4EA1C8001E078 +:10172000A01DDA038CF80C1028180307CB079C5C6B +:101730006CE0A055951892F7D2C008416CE0A0204B +:10174000E1C0ABE04C00B8C2F15C54EE04000C19EF +:101750008CB29C2FF45C54EE04000B583C178CC1E7 +:1017600041F36C00082FF4581CC0D15C54EE040007 +:101770000B178C2F79B28C2FF45C6CE0A0907E302C +:1017800012CEAA3002CE8AB2CC2FF45C54EE0407FB +:101790000CB2DC2FF413CB5C6B139C5C6CE0A04FA1 +:1017A0004F1892CD9AE04C00C1E08100D05C54EE1D +:1017B00004000C198CB29C2FF458ECC22130ECB20E +:1017C000CC5C54EE04070CF36C00082FF45C54EE70 +:1017D00004070CF36C00092FF45C54EE04070AF3C1 +:1017E0006A000A2FF45C6AF33B00090066270013C5 +:1017F00002F1EC56040034000080010035000100C5 +:10180000004C1F010D02F1EC560300000001005CCA +:101810006B2F89138C5C6CE0A0C20AE0A0903A3078 +:1018200012CACA592CC281312CB2CC5C54EE0407C6 +:101830000CF36C00082FF4306CFB6C002C139CFB39 +:101840006C002DFACCFFD02FC9324A130B18AB20F5 +:101850004ACFD130BCFB6C002EFB560054FACCFFB3 +:10186000D41A9B32C9190A16AA2049CFD1E0A090F8 +:10187000311892C83A593CC281313CB2CC5C54EE2A +:1018800004070CF36C00092FF4306CFB6C002C1374 +:101890009CFB6C002DFACCFFD02FC9324A130B18D9 +:1018A000AB204ACFD130BCFB6C002EFB560054FA63 +:1018B000CCFFD41A9B32C9190A16AA2049CFD1E00D +:1018C000A090081892C5AA594CC281314CB2CC5C88 +:1018D00054EE04070CF36C000A2FF4306CFB6C0020 +:1018E0002C139CFB6C002DFACCFFD02FC9324A136D +:1018F0000B18AB204ACFD130BCFB6C002EFB56003E +:1019000054FACCFFD41A9B32C9190A16AA204900EE +:101910005296001302F1EC560400350000800100DD +:101920003600010000D9D4010D02F1EC560300008D +:10193000000100CFD1E0A08FDF1892C31A595CFEDE +:1019400091FF46315CB2CC5C54EE04070CF36C00A2 +:10195000082FF4306CFB6C002C139CFB6C002DFAF0 +:10196000CCFFD02FC9324A130B18AB204ACFD1304D +:10197000BCFB6C002EFB560054FACCFFD41A9B32F1 +:10198000C9190A16AA2049CFD1E0A08FB51892C074 +:101990007A138CE04C00B1E08101465C54EE040007 +:1019A0000C198CB29C2FF45C6CE0A0496F581C039E +:1019B0008CF80C1028E08100E1060C199B583BC103 +:1019C000415C54EE04070BF96B00082FF45C54EEF5 +:1019D00004070BF96B00092FF45C54EE04070B2F7E +:1019E0006CB88B2FF4CD48589BC2915C54EE040721 +:1019F0000BA96B2FF45C54EE04070A140B2FF4B8F8 +:101A00004B5C54EE04070BA96B2FF45C54EE0407F7 +:101A10000A140B2FF4B85B5C54EE04070BA96B2F70 +:101A2000F45C54EE04070A140B2FF4B86B5C54EE0C +:101A300004070B00A309001302F1EC560400360062 +:101A4000008001003700010000666F010D02F1EC1B +:101A5000560300000001002F2CB88B2FF4CAA858A1 +:101A60001BC7515C54EE04000B178AF96A00082F5B +:101A7000F45C54EE04000B5C5A178BC1F1F96B0057 +:101A8000092FF45C54EE04070BF96B000A2FF45C89 +:101A900054EE04070BF96B000B2FF4300B5C6B5802 +:101AA000DBE08400885C54EE04070AF80B00092E82 +:101AB00069B28A2FF42FFBCF3BB96B2FF45C54EE45 +:101AC00004070AB16A140B2FF45C54EE04070AA948 +:101AD0006A140B2FF45C54EE04070A140B2FF499CC +:101AE0003B5C54EE04070BB96B2FF45C54EE040717 +:101AF0000AB16A140B2FF45C54EE04070AA96A14A5 +:101B00000B2FF45C54EE04070A140B2FF4994B5C72 +:101B100054EE04070BB16B2FF45C54EE04070AA9D2 +:101B20006A140B2FF45C54EE04070A140B2FF4997B +:101B30005B5C54EE04070BF96B00182FF45C54EE59 +:101B400004070B2E7CB88B2FF4C34858CBC1315CF3 +:101B500054EE04070BF96B00EBA4001302F1EC56F2 +:101B600004003700008001003800010000F184010A +:101B70000D02F1EC5603000000010000082FF45C98 +:101B800054EE04070BA96B2FF45C54EE04070A14FF +:101B90000B2FF4B85BC20858DBC1E15C54EE0407BC +:101BA0000BF96B00082FF45C54EE04070BA96B2FA4 +:101BB000F45C54EE04070A140B2FF4B85BC0C8069B +:101BC0000C5C54EE04070BB8CB2FF45C54EE040706 +:101BD0000BB8DB2FF4038CF80C10281803069C19A3 +:101BE0009B585BC200300AFB6A002CFB6B002DFA8D +:101BF000CBFFD02FCC3249190A16AA2049CFD130B9 +:101C0000BCFB6C002EFB560054FACCFFD41A9B325E +:101C1000C9190A16AA2049CFD1E0A08E911892FEC8 +:101C20009FFCE3E0A01A84E0A01E5C581CC1A13018 +:101C30000CFB6C002C305CFB6C002DFB660030FB59 +:101C400066003130BCFB6C002EFB560054FACCFF12 +:101C5000D41A9B32C9190A16AA2049CFD1E0A08E06 +:101C60006F301CA29C3012FE9FFCBFE04C00B2FE05 +:101C700091FCBB5C54EE04070CB29C0057DA0013D5 +:101C800002F1EC5604003800008001003900010028 +:101C900000B13F010D02F1EC560300000001002FDE +:101CA000F45C54EE04070CB2CC2FF45C54EE040741 +:101CB0000CB2DC2FF4139C585CFE90FCA6301BFB8E +:101CC0006B002CFB6C002D30BCFB6C002EFACCFFA3 +:101CD000D41A9B32C9190A16AA2049CFD1E0A08E86 +:101CE000411892FE9FFC93049C5C5C2E9DD8328030 +:101CF0000182F480016720800183E0800167C48055 +:101D000001686880006FE88000DF708000761480D2 +:101D100001558C8000D3508001B91C800155808012 +:101D200000C95480007564800155C0E06C28B0EA99 +:101D30001C0000199C5EFCD421E0A0C0551897E05F +:101D4000A01A08189630053004EF2C0064580CC017 +:101D5000E0E06B261CEA1B0000FE3BFF03E06C2862 +:101D6000B4EA1C0000298CE0A08BC2EF1C005E5876 +:101D70000CC0F0E06B261CEA1B0000FE3BFF02E0FB +:101D80006C28B4EA1C0000FE3CF9E8E0A0A872ED63 +:101D90003C005B581CC235E06C261CEA1C000000AD +:101DA000BBD6001302F1EC5604003900008001009C +:101DB0003A0001000024F4010D02F1EC560300008A +:101DC000000100E06A28B4EA1A0000F93B0100F6BD +:101DD0000B1068140B303AB68AED3A005BB6AAEDE8 +:101DE0003A005B2A462FCB1698580AC0500D39206E +:101DF0001A10C9CFD1301BF96B0100C0282FF45C39 +:101E00006458A4C0A4E06C37B0EA1C0000F80406D3 +:101E10000B581BCF5130155C655815C0F5E06B268B +:101E20001CEA1B0000FE3BFF01E06C28B4EA1C002A +:101E300000FE3CF778E0A056E16F8C580CC0F0E053 +:101E40006B261CEA1B0000FE3BFEFFE06C28B4EA98 +:101E50001C0000FE3CF710E0A04BECD82AD7038012 +:101E600001BA4480006DB08001514C80018AD0805D +:101E700000E8348000D26CD4211896169514941280 +:101E800097E06C0754EA1C0000405B99BB406BEE86 +:101E90001B800099CB407BEE1B800099DB30AA1899 +:101EA0009B2D4BF8FC010CE0A0025AC50C582CC02D +:101EB00030584CC161E06C08E0EA1C0000783B2F10 +:101EC000FB993B00FC0F001302F1EC5604003A00B2 +:101ED000008001003B000100009B4F010D02F1EC6E +:101EE000560300000001007839314BE80B0C0A144E +:101EF00039C045300B994BC1382F0C780B2FFB990B +:101F00000BC0E8588CC030590CC0A1E06C08E0EA66 +:101F10001C0000784B2FFB994B300B993BE06C0871 +:101F2000E0EA1C00007839314BEC0B0C0A1439C084 +:101F300035301B992B7849314BEA0B0C0A1439C008 +:101F400035302B992B782B581BC050582BC0303074 +:101F50000B992B782A149B3009580AC060AE8A99D5 +:101F60003999499929C028AE89169CD8220000D4F5 +:101F700031201D3003E0670754EA1700003001EFFD +:101F80004100F0EF4100F4E06008E0EA100000607A +:101F90001C2FFC811CEEF600FC58A6C554EEF40183 +:101FA0000C30AA300B089CE0A002061895EF450102 +:101FB0000030AA301B089CE0A001FE1894EF4401F9 +:101FC00004EE06002C500C601CF80C1014400BF7AB +:101FD0004C00985816C3356A0C680BE0A06DFE18CB +:101FE000928FE26A1C681B009C60001302F1EC56A1 +:101FF00004003B00008001003C000100008F6701ED +:102000000D02F1EC56030000000100E0A06DF8188D +:10201000968FF66A2C682BE0A06DF2189BEF4B00B0 +:1020200040E0A06EB118950C9C0C9BE0A06EAC1823 +:1020300096049C049BE0A06EA70C9BE0A06E4E0A49 +:102040009BE0A06E4B400BF74C0070400CF8FB007F +:1020500098400CF8FC0094181B400CF94B00BCEEA7 +:10206000FC00FC2FFCEF4C00FC601C58ACC0443062 +:102070003CEF4C00F8EEFC00FC58ACE0850102EEB1 +:10208000FC00FC201CEF4C00FC30AA30ABEEFC0145 +:102090000CE0A07B9BEF4C006830AA30ABEEFC015B +:1020A0000CE0A07BB1EF4C006C30AA30ABEEFC0131 +:1020B0000CE0A07BC71894EF4400703006C098EE87 +:1020C00006002C79DC069BE0A06E0818932FF658CA +:1020D00096CF756FACFC1B4120E0A06EC91896EF3F +:1020E0004600446FBCFC1B4120E0A06EC11895EF78 +:1020F000450048FC1B4120089CE0A06EB91894EFF5 +:1021000044004C601C58ACC075EF46001506001327 +:1021100002F1EC5604003C00008001003D0001008B +:1021200000E5DF010D02F1EC5603000000010000A4 +:102130005CEF450060EF4400643002C0F830AAE470 +:102140000B11095C8BEEFC010CC59DEF4C01086F77 +:10215000996F8A6F7BCCBC2FF258A2CF156E9CEE84 +:10216000FB00F0163CC494018C580CC0D1EEFC006E +:1021700098EF4C00E4301CA08CEF46005CEF45006B +:1021800060EF4400646EACEEFB00F4163CC1140139 +:102190009C580CC0F1EEFC0098EF4C00E8301CA0FD +:1021A0009CEF46005CEF450060EF440064C028A04F +:1021B00091EEFB00986E0AEEFC00E8162C183AC06F +:1021C000A2019C580CC070A0A1A0B1301CEF4C0023 +:1021D000F8C558EEFC00E4181B163AC0A2018C5852 +:1021E0000CC070A0A1A0B1302CEF4C00F8C4783026 +:1021F0003CEF4C00F8C438EF46005CEF450060EF60 +:10220000440064A081A09101AC580CC031301CA0E6 +:10221000ACFC1B447A069CE0A06DC81896301BE00D +:10222000A06F46C072FC1CC47A069BE0A06DBE0085 +:102230006165001302F1EC5604003D0000800100CE +:102240003E000100007014010D02F1EC5603000085 +:1022500000010018966E2BFC1C41A0E0A06DB80C8C +:102260009BE0A06F43C0B201BC580CC091EEFC00D3 +:1022700098EF4C00EC301CA0BCC028A0B16E1BFE37 +:102280007CFE0C180BEEFA0098EEFC00EC181A1409 +:102290003BCC1201BC580CCBE0304CEF4C00F8307A +:1022A0000CC118EE0C002BF6FA009CF74A00985867 +:1022B0008CC08477EAF74A0074F6FA00C4F74A0043 +:1022C000C02FFC589CCEF5EEFC00F8581CC080587E +:1022D0002CC080583CC080584CC080C098302CC066 +:1022E00088304CC068308CC048310CC028300C2F6E +:1022F000FDD832800133BC800133F8800134348052 +:102300000118CC80011A6080011C7C80011978EBD7 +:10231000CD40F81895149712966A0CE0A06C9418AA +:1023200094E0630754EA130000E74400506A1C0E6F +:102330009BE0A06C891897E74700546A2C0C9BE03F +:10234000A06C821896E7460058300B089CE0A06EFF +:10235000CDC05200CC7C001302F1EC5604003E00CC +:10236000008001003F00010000CFAF010D02F1EC41 +:1023700056030000000100EE148000E744005030D6 +:102380000B0E9CE0A06EC4C052EE178000E7470021 +:1023900054300B0C9CE0A06EBBC052EE168000E7E0 +:1023A0004600586747663B0E9CE0A06EB1C0D267FE +:1023B0005C664BE0A06EACC082676C665BE0A06EB2 +:1023C000A7C0323016C0283006666B0E9CE0A06EA7 +:1023D0009FC0D2675C667BE0A06E9AC082676C6625 +:1023E0008BE0A06E95C032301CC028300CE6FB009C +:1023F000F00C0BE74B00F0E6FB00F4180BE74B008A +:10240000F4E3CF80F8D703800117F080011C949883 +:1024100089F4091900C0333009B80998892FF9B82F +:10242000099889F4091900C033300AB80A988AF467 +:102430000A100C140C2FCCB709B928170818A85E7D +:10244000FF00009889122B5C8B580BC024140B5C86 +:102450008BF60B100C160C2FCC5EFCEBCD408030B5 +:1024600007E0A016E9C02030170E9C5C5CE3CD802D +:1024700080D70380006DBC008EC4001302F1EC56BF +:1024800004003F00008001004000010000CEC701B1 +:102490000D02F1EC56030000000100D7F1C888D707 +:1024A000F1C868D7F1C848D7F1C828D7F1C808D70C +:1024B000F1C7E8D7F1C7C8D7F1C7A8D7F1C788D700 +:1024C000F1C768D7F1C748D7F1C728D7F1C708D7F0 +:1024D000F1C6E8D7F1C6C8D7F1C6A8D7F1C688D7E4 +:1024E000F1C668D7F1C648D7F1C628D7F1C608D7D4 +:1024F000F1C5E8D7F1C5C8D7F1C5A8D7F1C588D7C8 +:10250000F1C568D7F1C548D7F1C528D7F1C508D7B7 +:10251000F1C4E8D7F1C4C8D7F1C4A8D7F1C488D7AB +:10252000F1C468D7F1C448D7F1C428D7F1C408D79B +:10253000F1C3E8D7F1C3C8D7F1C3A8D7F1C388D78F +:10254000F1C368D7F1C348D7F1C328D7F1C308D77F +:10255000F1C2E8D7F1C2C8D7F1C2A8D7F1C288D773 +:10256000F1C268D7F1C248D7F1C228D7F1C208D763 +:10257000F1C1E8D7F1C1C8D7F1C1A8D7F1C188D757 +:10258000F1C168D7F1C148D7F1C128D7F1C108D747 +:10259000F1C0E8D7F1C0C8D7F1C0A800608000132F +:1025A00002F1EC56040040000080010041000100EF +:1025B00000A26B010D02F1EC56030000000100D7F0 +:1025C000F1340A40FBFACCFFC8F01F0007D7F2D65F +:1025D00013E1BA000440FB1A9CF01F0003D7F2D6A7 +:1025E00003000080009A5C300CF01F000E580CF8BD +:1025F0000F1710D603301CF01F000A580CF80F17E5 +:1026000010D603302CF01F0007580CF80F1710D607 +:1026100003303CF01F0003580CF80F1710D603804E +:1026200001B50CE06A4278EA1A0000740C787978F7 +:10263000AB126B1699E2190700C160E21B0300C0E0 +:10264000403FCB951BC0383FEB951B783BAFDB99E8 +:102650003B3FFB99BB999B300CE06B4288EA1B0027 +:1026600000B68CD603EDBB0000C142E06B4288EAA5 +:102670001B0000785A762912CA9729764A201A97A1 +:102680004A764A580AC391301A999A300CB68CD6B9 +:1026900003EDBB0004C0C23EFB99BB3FFB999B30DE +:1026A0000CE06B4288EA1B0000B68CD603EDBB0041 +:1026B00001C232E06B4288EA1B00007639580900FB +:1026C000093E001302F1EC560400410000800100B5 +:1026D000420001000037A0011202F1EC5603000095 +:1026E0000000FBC081302A999A310A998A300CB6D1 +:1026F0008CD6037618113997189969763C201C9767 +:102700003C763C580CC0B1178C580CC080300CB6CD +:102710008C743C784A973A783C971CD6033000D0AA +:1027200021E067429CEA1700006E3C786678950CC1 +:10273000650C9BE21B70C0C0A0FE6BFFFF998B3F36 +:10274000FB99AB302C6E2B5D1BC4883084EA1400DF +:1027500040EBE4000BC0B0FE6BFFFF99AB998BED33 +:10276000B50003C042300C6E2B5D1BEDB50010C1EF +:10277000926E3C99A4E07B000099ABEDB60005C0D9 +:10278000E2FC1B008099ABE06B70C8EA1B008099EB +:102790007B6E1C5D1C6E3B974CC048E06B70C9990A +:1027A0007BEDB50000C0626E3C783C5C5CF01700CD +:1027B00000EDB50017C1226E3CFC1B0080EDB60099 +:1027C00008C072998B99ABE06B010099ABC0689916 +:1027D000AB6E1C5D1C6E3B974CD022D603000300F1 +:1027E00000FC0004E0A02CA6004F8F001302F1ECC7 +:1027F0005604004200008001004300010000881BD5 +:10280000010D02F1EC56030000000100D603D703CE +:1028100080009C48E0A02D32D603D70380009D6C39 +:10282000E0A02C60D603D70380009BD4E0A02BE26D +:10283000D603D70380009AE4C0080000D431204DAD +:10284000300C503C502CBA0CE06C1DE0EA1C00002F +:102850007843E065136CEA150000EAF609589946DA +:10286000EAF70954EB470958EAFC0950E0A06CD696 +:10287000189BFC1C447AE0A06B7BEB4C0954EAF4F7 +:102880000948EAFC0930081CFE3CFF06E06B00FA30 +:10289000F80B0D0A5C7B501B401CE04C004CC054F4 +:1028A000EAFC093C581CC0E13006EB5600FAEB5636 +:1028B00000FC302CE06B1DE0EA1B0000B60CE08F42 +:1028C000022DEAFC0944584CC3D30C9C0E9BE0A09B +:1028D0006C69C382EAFB09540E9CE0A06C63C322BE +:1028E000EAFC0954E0A07B3E149016910C9CE0A0F9 +:1028F0007B39E068CCCDEA18CCCCE069CCCCEA19C5 +:102900003FFCE0A07AA600980299E0A0006DC1000B +:102910001302F1EC56040043000080010044000162 +:1029200000009C33010D02F1EC5603000000010091 +:102930007B4BC1A2EAFC0954301BEA1B4040E0A0DB +:102940006C37C123EB470954EB460958E06C1DE096 +:10295000EA1C00009943303CE06B1DE0EA1B0000DC +:10296000B60CE08F0240EAFC0914EB4C0918EAFCB3 +:102970000924EB4C0928401C5C7CE0A06C61189297 +:10298000EAFC0910049BE0A06B051891EAFC092001 +:10299000049BE0A06AFF18933009EB490914EB4946 +:1029A000092408973004C2682FF75C77E04700FAE3 +:1029B000C0213007EA070026ECFC013C029BE0A0A6 +:1029C00069B1189BE0A06A72EAFB0914E0A06A18DA +:1029D000EB4C0914ECFC0524069BE0A069A3189BB2 +:1029E000E0A06A64EAFB0924E0A06A0AEB4C09242F +:1029F0002FF45C74401C1834CD85EAFC0914049B48 +:102A0000E0A06AC81893EB430914EAFC0924049B6C +:102A1000E0A06AC01894EB440924E06C1DE0EA1CB5 +:102A20000000783CE06B1DE0EA1B0000971CEAFC0C +:102A3000003846001302F1EC560400440000800107 +:102A4000004500010000F68B010D02F1EC56030079 +:102A5000000001000A0CEAFB0A10E0A06975189753 +:102A6000E06C1DE0EA1C00009937E0A003FF581C51 +:102A7000C0713006EB5600FAEB5600FCC729EAFCA1 +:102A80000944580CC111EB1C00FCEB1B00FAF60CBE +:102A9000000A585AC095160CBA0C3006EB5600FACC +:102AA000EB5600FCC0A8EAFC0944580CC060300694 +:102AB000EB5600FAEB5600FCEAFB09449A8C180B23 +:102AC000C3D1FC113FE0EAFB0928089CE0A069AAF9 +:102AD000E0A07A6C30080299E0A079DF3008E06964 +:102AE000C000EA194062E0A07A81C183EAFB0918BC +:102AF000069CE0A06997E0A07A5930080299E0A00E +:102B000079CC3008FC194054E0A07A70C073FC1BEB +:102B100041A00E9CE0A06B6AC112EB1C00FA2FFCD6 +:102B2000EB5C00FAEAFC0930EB4C094C306CE06BD2 +:102B30001DE0EA1B0000B60CC149EB1700FAEE0CD1 +:102B40001510C170EAFB0928089CE0A06A35FC1B3F +:102B50004040E0A0001574001302F1EC560400455B +:102B6000000080010046000100006340010D02F1F9 +:102B7000EC560300000001006B4BC0A25837C0B5F3 +:102B80009A8B0E0BBA0B300CEB5C00FAC048300C81 +:102B9000EB5C00FAEAFB09449A8C180BC2B1EAFC20 +:102BA0000954FC1B3F80E0A06B33C082307CE06B9B +:102BB0001DE0EA1B0000B60CCE68EAFC0954E06B8D +:102BC0006667EA1B4016E0A06B17C143EB1C00FCD4 +:102BD000582CC0D4EB1C00FC2FFCEB5C00FC308CB0 +:102BE000E06B1DE0EA1B0000B60CCCD89A8A180AEC +:102BF000BA0A3006EB5600FC06980899EAFA09541E +:102C0000401B9A8CE0A003AA581CC181EAFC095819 +:102C1000EB4C0954EAFC0928EB4C0924E06C1DE05C +:102C2000EA1C0000781CE06B1DE0EA1B0000973CEA +:102C3000EAFC0918EB4C0914CA68EAFC0954301B79 +:102C4000EA1B40A0E0A06AD8C053FC1C40A0EB4C9B +:102C50000954EB5600FAEB5600FCEAFC0944580C08 +:102C6000C1A1EAFB0954EB4B095CEB4B0960EAFCA0 +:102C70000914EB4C091CEAFC00418F001302F1EC33 +:102C80005604004600008001004700010000DCFB04 +:102C9000010D02F1EC560300000001000924EB4C89 +:102CA000092CE06C1DE0EA1C0000783CE06B1DE0A4 +:102CB000EA1B0000972CC6B8E0A002A8581CC2610D +:102CC000EAFB0954FC1C4000E0A069261897EB477A +:102CD0000954301C502CEAFB0914FC1C3F00E0A0F6 +:102CE000691B1896EB460914EAFB0924FC1C3F00FB +:102CF000E0A06912EB4C0924EB460918EB4C0928BB +:102D0000EB4709589A8B2FFBBA0BEAF60954EAFBFA +:102D100009580C9CE0A068AAFC1B3F00E0A068FCDE +:102D20001897EB47095CEAFB0914EAFC0918E0A0D4 +:102D3000689DFC1B3F00E0A068EFEB4C091CEAFB20 +:102D40000924EAFC0928E0A06891FC1B3F00E0A0F0 +:102D500068E3EB4C092C0C9C0E9BE0A06A6BC04313 +:102D6000402C581CC031EB460960E06C1DE0EA1CA9 +:102D70000000781B783CE0A06879FC1B3F00E0A0D5 +:102D800068CBE06B1DE0EA1B0000972C9A8CC81CF6 +:102D9000E0A004268B0CC65CEAFC0930007F6F00C3 +:102DA0001302F1EC560400470000800100480001C6 +:102DB00000004B10010D02F1EC5603000000010071 +:102DC000EB4C094C301C503CEB4C0A04403C581C6A +:102DD000C051301CEB5C0028C088E06C1DE0EA1C90 +:102DE0000000988CEB5C00289A8C8BBCEAFC0950A4 +:102DF0008BCC401CEB5C0034EB1C00F6EB5C00362B +:102E0000EAFC09148BECEAFC09248BFCEAFC09546B +:102E1000EB4C0040EAFC091CEB4C0044EAFC092C9A +:102E2000EB4C0048EAFC095CEB4C004CEAFC093036 +:102E3000EB4C09483006EB4609503009EB490910C4 +:102E4000EB490920EB46093C6B7CEB4C0A480A9C99 +:102E50002B0C300A300BB91BF8EB00080A9CFE3C27 +:102E6000FF34B91B992AEAFC0A14EB4C0A18EB4907 +:102E70000A14402CE06B1DE0EA1B0000977C403CEC +:102E80002FCDD832E06C136CEA1C0000F8FB09402F +:102E9000991BF8FB0964996BF8FB0968997BF8FBAF +:102EA000096C998BF8FB095C992BF8FB09FC999B41 +:102EB0005EFD0000D431202D189330063005E06708 +:102EC00000C804001302F1EC560400480000800121 +:102ED0000049000100000BAB010D02F1EC560300AC +:102EE00000000100136CEA1700005813C225EEFC25 +:102EF0000940189BF7DBC003EE0B002BF6FB099093 +:102F0000201CF9DCC003EE0C002CF94B0990EEF408 +:102F10000944307CE80C0D0AEE0B002CF8FC09701B +:102F20002014307BE80B0D0AEE0B002BF74C0970D8 +:102F3000EEF2095CFC1B4020049CE0A0699FC0836A +:102F4000EEFC09F8FC1B4040E0A06998C042303C10 +:102F5000AE6CC038304CAE6C8EECEEFB0940F7DB4B +:102F6000C003EE0B002BF74C0990300CC068583BA7 +:102F7000C0212FF52FFC5C7C588CC094EE0C002BEC +:102F8000F6FB0990584BCF412FF6CF5B5C765C7512 +:102F90000C05EA0C161F1805A1550C35C044304C21 +:102FA000AE7CC038303CAE7C0496FC153FC0049C1F +:102FB0000A9BE0A06963C0320A96C0A8301BEA1BD6 +:102FC0004090049CE0A0694EC033FC1640900C9CDD +:102FD000E0A07834149416950C9CE0A0782FE0685B +:102FE000B8BBEA1800822B001302F1EC560400492A +:102FF00000008001004A000100009E60010D02F106 +:10300000EC56030000000100068DE06916F0EA1995 +:103010003FB8E0A0779C08980A99E0A077981494AC +:1030200016950C9CE0A0781CE06816F0EA18504851 +:10303000E06918FCEA193FE9E0A07789E0681134FB +:10304000EA183C36E06952BDEA19BFDAE0A0766AB8 +:1030500008980A99E0A07632E0A068CCEEFB00C4A4 +:10306000E0A06790E0A077FCE068EDB8EA181C22C9 +:10307000E0691818EA193F78E0A07769E0A068BA1B +:10308000EF4C0964EF0B00C8582BC091E06BC41ED5 +:10309000EA1B3F7EE0A06776EF4C0964EEFB09680F +:1030A000EEFC0964E0A067181890EF400968EEFC98 +:1030B00009640C9BE0A06766FC1B4270E0A067629D +:1030C0001896EF46096CEEF40944307CE80C0D0AC2 +:1030D000EE0B002CF9460970300CEF4C098C58743B +:1030E0003005C262C0C8EE05002CF8FC0970029BD6 +:1030F000E0A066F2EF4C098C2FF55C75EEF1098CBF +:103100000A34CF225C750A9C00425C001302F1EC89 +:103110005604004A00008001004B0001000021DB42 +:10312000010D02F1EC56030000000100E0A0690669 +:10313000189B029CE0A067ACEF4C098CC158EE05CF +:10314000002BF6FB0970E0A066D9EF4C098C2FF537 +:103150005C75EEFC098C5875CF35FC1B40E0E0A097 +:103160006797EF4C098C0C9CE0A0778CFC15400C09 +:103170008EFC584CC140E068999AEA189999E06928 +:103180009999EA193FB9E0A076F430080A99E0A0CD +:1031900075DBE0A06841EF4C0A00C138E068999AFD +:1031A000EA189999E0699999EA193FC9E0A076E18E +:1031B00030080A99E0A075C8E0A0682EEF4C0A001C +:1031C000049CE0A0775F3008FC19404EE0A076D167 +:1031D00014981699300AFC1B3FF0E0A07707BB1B40 +:1031E000EEFC00C0E0A0774E14941695EEFC0A00A9 +:1031F000E0A07748E068147BEA1847AEE0697AE11E +:10320000EA193F74E0A076B508980A99E0A076B173 +:10321000BB08E0A076AEE0A067FF1896EF460A0074 +:10322000EEFB09FCE0A0666A1895EF4500691C00FA +:103230001302F1EC5604004B00008001004C000129 +:10324000000035F3010D02F1EC560300000001000F +:1032500009FCEEFC09402FFCEF4C0940EEFC094450 +:103260002FFCEF4C0944E60C1510C220EEFC09407F +:10327000060CEF4C0940EEFC0944060CEF4C0944E7 +:10328000069CE0A0686DEEFB0964E0A0669F009BD1 +:10329000E0A06646EF4C0968069CE0A068610C9BC4 +:1032A000E0A066940A9BE0A0663BEF4C09FC2FED82 +:1032B000D83AD703800139BC80011D0CEBCD40FC0E +:1032C0003007E066136CEA160000ECF50954ECFCDC +:1032D0000960E0A076E9E0686666EA186666E0697B +:1032E0006666EA193FE6E0A07656149216930A9CA9 +:1032F000E0A076DA04980699E0A076F6C072ED1C9C +:1033000000F6582CC0353017C178E06B999AEA1B4B +:103310003F990A9CE0A067E8C0F26D74301BEA1B7D +:103320004220089CE0A067D4C073FC1B42C8089CE4 +:10333000E0A067DACE93ECFC09F8FC1B4000E0A0AB +:1033400067D3C0D2301BEA1B40000A9CE0A067C0D4 +:10335000008733001302F1EC5604004C000080019A +:10336000004D000100005F4B010D02F1EC5603001F +:1033700000000100C063ED1C00F6583CC02530077A +:103380000E9CE3CD80FC0000EBCD40EC3006E06706 +:10339000136CEA1700008EFC583CC1E4EEFC0954A3 +:1033A000301BEA1B4000E0A067A5C163EEFC0914D6 +:1033B000FC1B4120E0A067AAC0F2EEFC0924FC1B24 +:1033C0004220E0A067A3C082304CE06B1DE0EA1B06 +:1033D0000000B60C3016EEF50924FC1B41A00A9C37 +:1033E000E0A06794C2D3FC133FE0EEFB09280A9CDF +:1033F000E0A065A8E0A0766A30080699E0A075DD37 +:103400003008FC194044E0A07681C1A3EEF5091410 +:10341000EEFB09180A9CE0A06595E0A076573008FD +:103420000699E0A075CA3008FC194034E0A0766E19 +:10343000C073FC1B41200A9CE0A06768C082305C1E +:10344000E06B1DE0EA1B0000B60C30160C9CE3CDCF +:1034500080EC0000EBCD40FE189516943006E06736 +:10346000136CEA170000EEFC094418055825C1C387 +:10347000EEFC09540090FD001302F1EC5604004DDF +:1034800000008001004E00010000CA80010D02F121 +:10349000EC56030000000100301BEA1B4060E0A076 +:1034A000673BC143EEFC0928EEFB0924E0A0662639 +:1034B000301BEA1B40A0E0A0672FC083309CE06B6C +:1034C0001DE0EA1B0000B60C30165825C1F330137E +:1034D000EA134170EEFC0928EEFB0924E0A0660E19 +:1034E000069BE0A06719C123EEFC0918EEFB091446 +:1034F000E0A06604069BE0A0670FC08330ACE06BE1 +:103500001DE0EA1B0000B60C30165805C1F0E0655E +:103510001DE0EA1500006A2CE0A075EAE06833338C +:10352000EA183333E0693333EA193FD3E0A0755723 +:10353000149216936A3CE0A075DB04980699E0A00B +:1035400075F7C04230BCAA0C3016EEFC0954301B93 +:10355000EA1B4090E0A066E0C092EEFC095C301BE4 +:10356000EA1B4080E0A066D8C1D3EEFC0924FC1B16 +:1035700043C8E0A066DDC0C3EEFC0914FC1B431683 +:10358000E0A066D6C053EF1C00F6582CC0B58EFCE8 +:10359000583CC08530CCE06B00E417001302F1EC1E +:1035A0005604004E00008001004F00010000753BF2 +:1035B000010D02F1EC560300000001001DE0EA1BC2 +:1035C0000000B60C3016EEFC091CFC1B43C8E0A042 +:1035D00066C1C083EEFC09F8FC1B40A0E0A066BAFF +:1035E000C1A2EEFC0A1CEEFB0A20160CE0A075F747 +:1035F0003008FC193FE0E0A075043018FC19404485 +:10360000E0A075A6C08330DCE06B1DE0EA1B000083 +:10361000B60C3016089CE0A066EF189BEEFC00CCC0 +:10362000E0A0657E1892EF4200D8089CE0A066E416 +:10363000189BEEFC00D0E0A065731893EF4300DC0C +:10364000089CE0A066D9189BEEFC00D4E0A0656859 +:103650001895EF4500E0EEF400E4089C049BE0A020 +:1036600064271891301BE0A06669C0330294C068DB +:10367000049C089BE0A0641C1894EEF200E8049CF3 +:10368000069BE0A064151891301BE0A06657C0337C +:103690000293C068069C049BE0A0640A1893EEF2B3 +:1036A00000EC049C0A9BE0A064031891301BE0A08E +:1036B0006645C0330295C0680A9C049B00F2040072 +:1036C0001302F1EC5604004F00008001005000018D +:1036D00000006553010D02F1EC56030000000100EB +:1036E000E0A063F81895089C069BE0A064610A9B23 +:1036F000E0A0645EE06B1DE0EA1B0000976C0E9C8E +:10370000FE3CFF28FE37FF1CB90AAF1B782A8F2A20 +:103710000C9CE3CD80FED70380013B1E8001394223 +:10372000EBCD40E03006E065136CEA150000EAFCE2 +:1037300009405B6CC112E0679680EA174B18EAFCFF +:1037400009680E9BE0A0660CC072EAFC09FC0E9BA7 +:10375000E0A06606C02330160C9CE3CD80E000009C +:10376000D631201D1694300C500CE0A004B1E06757 +:10377000136CEA1700003006EF460A043003EF43EB +:103780000A0CEF430A10E06C1DE0EA1C0000B806CA +:10379000402CC9BDEEFC09B0585CC0A1301CEF4CF8 +:1037A000093CEF4609B0EF5600F2EF5600F4EEFC8C +:1037B0000950080CEF4C0950EEF00930EEFC0948B6 +:1037C0001830C041301CEF4C093CEEF20934E405DE +:1037D000100C0E05402C780CEB4C0060402C781C33 +:1037E0000020E3001302F1EC5604005000008001B9 +:1037F00000510001000071EE010D02F1EC560300D2 +:1038000000000100EB4C0064402C782CEB4C00686D +:10381000F7D4C010402CE0A0020D8F4C6BAC6B9421 +:103820006B85189BE0A0642C1891089C089BE0A075 +:10383000642718940A9C0A9BE0A06422089BE0A0DD +:1038400063C9029BE0A063C6E0A07488E0A0A6065E +:10385000E0A0654E1895EEFC0938580CC121300CDB +:10386000C068EE0C002BF74501002FFC5C7C587CF7 +:10387000CF95FC1B40E00A9CE0A06402EF4C0138AD +:10388000EE020021E2FB01000A9CE0A06335EEFBA2 +:103890000138E0A0639F1894EF440138E34501002C +:1038A000EE000022E544013CEEFB0910E0A063922B +:1038B000EF4C0910E2FB011C089CE0A0631D189569 +:1038C000E5450524E344011CEEFB0920E0A06382EA +:1038D000EF4C09200E9CFE3CFF4C4029B30BB92A4B +:1038E000130A18AAEF1C00F02FFCEF5C00F0EEFCAE +:1038F00009B0581CC030583CC3A1EF1C00F0582C34 +:10390000C2748EFB0036FD001302F1EC5604005128 +:1039100000008001005200010000E425010D02F1C9 +:10392000EC56030000000100584BC244EEFC094471 +:10393000580CC761EEF2090C3014EA1440E0049C04 +:10394000089BE0A0653DC0620A9C089BE0A0652C36 +:10395000C0D2FC14C0E0049C089BE0A06525C6030F +:103960000A9C089BE0A0652CC5B2301CEF4C093CBA +:10397000C578E04C0027C0D5EF1B00F2F60A151001 +:10398000C050160CE04C004BC045301CEF4C093CBD +:103990000A9BEEFC090CE0A00279EEFC09B0581C71 +:1039A000C3F1EF1C00F2F80B1510C3A0EF1B00F4DD +:1039B000F60A1510C350303A160CE04C003DC045D5 +:1039C000301CEF4C093C8EFC584CC025302AEF1CB3 +:1039D00000F6F80A1900C042301CEF4C093CEEFC1E +:1039E0000A1CEF4C0A20EEFB0A24EEFC0A28180BF6 +:1039F000EEFC0A2C180BEF4B0A1CEF460A2CEF4684 +:103A00000A28EF460A24FEB0F829500CEF5600F4BD +:103A1000EF5600F6E06C1DE0EA1C00009956EEFB44 +:103A20000930EEFC094C181B003EAE001302F1EC0D +:103A300056040052000080010053000100005B9E0C +:103A4000010D02F1EC56030000000100FE3BFF06F1 +:103A5000E06C00FAF60C0D0AE04B0096C111EF463F +:103A60000944EF43095CEF43098C8F838F23AE66D3 +:103A7000EF5600FAEF5600FC301CEF4C0A04E04B06 +:103A80000064C1818F838F230E9CFE3CF670300A48 +:103A9000300BB91BF8EB0008F8EB0010F8EB00183E +:103AA000AE768F23301CEF4C0A04EF5600FAEF5627 +:103AB00000FCEEFC0930EE0C002CF8FC0524EF4C69 +:103AC000090CEEFC09302FFCEF4C0930EEFC0930FC +:103AD000E04C00FAC031EF460930EEFC09342FFC0F +:103AE000EF4C0934EEFC0934587CC031EF46093400 +:103AF000EEFC09382FFCEF4C0938EEFC0A04580C98 +:103B0000C120EF470A080E9BFE3BF5B40E9C169EA3 +:103B1000305AB909BD28201ACFD10E9CFE3CF5B40D +:103B2000EF4C0A08400C2FFDDC32D70380019D5476 +:103B300080011BE8EBCD40F81895E067136CEA179D +:103B40000000EEF60A30EEF400B40C9C00770000A2 +:103B50001302F1EC560400530000800100540001F0 +:103B600000004FB6010D02F1EC5603000000010009 +:103B7000E0A0649C18936A0C089BE0A061F3069B8C +:103B8000E0A062B4300BE0A0643FC202EEFB0A3C4E +:103B9000089CE0A061E7E0A07317BFDBE068999B99 +:103BA000EA189999E0699999EA193FC9E0A0732A3E +:103BB000C063EEFC0A242FFCEF4C0A24EEFC00B498 +:103BC000EF4C0A3C5C36EF460A30EEF60A34EEF46F +:103BD00000B80C9CE0A0646A18936A1C089BE0A0E3 +:103BE00061C1069BE0A06282300BE0A0640DC202BE +:103BF000EEFB0A40089CE0A061B5E0A072E5BFDBE7 +:103C0000E068999BEA189999E0699999EA193FC97E +:103C1000E0A072F8C063EEFC0A282FFCEF4C0A28E3 +:103C2000EEFC00B8EF4C0A405C36EF460A34EEF684 +:103C30000A38EEF400BC0C9CE0A0643818936A2C9F +:103C4000089BE0A0618F069BE0A06250300BE0A0D3 +:103C500063DBC202EEFB0A44089CE0A06183E0A0A3 +:103C600072B3BFDBE068999BEA189999E06999996A +:103C700000CADB001302F1EC56040054000080017E +:103C8000005500010000250E010D02F1EC56030065 +:103C900000000100EA193FC9E0A072C6C063EEFC53 +:103CA0000A2C2FFCEF4C0A2CEEFC00BCEF4C0A4413 +:103CB0005C36EF460A38E3CF80F8D70380011D3821 +:103CC000D531201D1896E065136CEA1500006C0CC8 +:103CD000EAFB00B4E0A06158500C6C1CEAFB00B891 +:103CE000E0A0615218906C2CEAFB00BCE0A0614C93 +:103CF0001891400BBFDB009CBFDC0297BFD7E0A050 +:103D000061B10E9BE0A061AE1897400CBFDC6B4B1D +:103D1000E0A061A8EB4C0050009CBFDC6B5BE0A016 +:103D200061A1EB4C0054029CBFDC6B6BE0A0619A7C +:103D3000EB4C00586B7B0E9CE0A06194EB4C005C5C +:103D4000EAFB00CC6C0CE0A0618DEB4C00CCEAFBF4 +:103D500000D06C1CE0A06186EB4C00D0EAFC00D4E3 +:103D60006C2BE0A0617FEB4C00D4EAFC0938580CC6 +:103D7000C121300CC068EA0C002BF74709B42FFCB6 +:103D80005C7C58FCCF95FC1B41700E9CE0A061C090 +:103D9000EB4C09F0001F2A001302F1EC5604005509 +:103DA00000008001005600010000B0C5010D02F1C5 +:103DB000EC56030000000100EB1C00F8EA0C0026A2 +:103DC000ECFB09B40E9CE0A060F1EAFB09F0E0A076 +:103DD000615BEB4C09F0ED4709B4FC1B4170E0A0BE +:103DE000621D1893EB4309F8E0641E08EA14000012 +:103DF000681B009CE0A0619E1897680B400CE0A037 +:103E000061991896300BE0A06323C0E3300B0E9C41 +:103E1000E0A0631EC093682B029CE0A0618B300B76 +:103E2000E0A06316C4D2682B029CE0A061831892C4 +:103E30000C9C0E9BE0A0630CC0A20C9C049BE0A019 +:103E40006307C0320C9CC098049CC0780E9C049BF5 +:103E5000E0A062FECFA20E9C301BE0A062ED0C9CA5 +:103E60000E9BC133E0A062F4C0A20C9C049BE0A0B6 +:103E700062EFC0320C97C1C80497C1A80E9C049B86 +:103E8000E0A062E6CFA2C148E0A062E2C0A20C9C22 +:103E9000049BE0A062DDC0320C97C0880497C06824 +:103EA0000E9C049BE0A062D4CFA2EE178000EAFC37 +:103EB0000A140E9BE0A062CC0036BD001302F1ECA8 +:103EC00056040056000080010057000100000F7EDC +:103ED000010D02F1EC56030000000100C032EB4777 +:103EE0000A14400C890C89108921FC1B3E80069C19 +:103EF000E0A062C0C0829ADCEAFB09F4180BEB4B2D +:103F000009F4C048300CEB4C09F4EB1C00F82FFC12 +:103F1000EB5C00F8EB1C00F858FCC041300CEB5C8B +:103F200000F8EAFC09F42FFDD932D703800117F01D +:103F3000800118CC80011A6080011978EBCD40FC1B +:103F4000189616953004E067136CEA1700008EFC93 +:103F5000584CC035FC144000300B0C9CE0A0627E35 +:103F6000C0B3300B0A9CE0A06285C062EF1C00F673 +:103F70002FFCEF5C00F6EEFC09B0580CC0A0581CFA +:103F8000C650582CE08000AF583CE08000D3C0B948 +:103F9000089CE0A0714F3008FC19401CE0A06FACF9 +:103FA000149216930C9CE0A0714514981699049AEB +:103FB000069BE0A0715DC2730A9CE0A0713B14985F +:103FC0001699049A069BE0A07155C1D2EF1C00F02F +:103FD000590CC043300CEF5C00F0301C009C6300B7 +:103FE0001302F1EC56040057000080010058000154 +:103FF00000009895010D02F1EC560300000001004D +:10400000EF4C09B0E0631DE0EA130000668CEF4C52 +:104010000A0C669CEF4C0A10EEFC0930EE0C002CEA +:10402000F8FC0524878CCD18EEFC0930EE0C002C32 +:10403000F8F20524E0631DE0EA130000669B049C8F +:10404000E0A0622AC0228792300B0C9CE0A062188C +:10405000E08300BC300B0A9CE0A0621EE08200B648 +:10406000301CE06B1DE0EA1B0000975CCAE8EEFC28 +:104070000930EE0C002CF8F20524E0631DE0EA1391 +:104080000000668C049BE0A06207C0228782FC13BC +:104090003F800C9C069BE0A061F3E08300970A9CA4 +:1040A000069BE0A061F9E0820091EF1C00F0EF5C5C +:1040B00000F2300CEF5C00F0089CE0A070CD14988A +:1040C0001699300AFC1BC01CE0A06EF414921693E3 +:1040D0000A9CE0A070C104980699E0A070DDC102BE +:1040E000303CEF4C09B0EEFC0930EE0C002CF8FC33 +:1040F0000524E06B1DE0EA1B0000979CC668302C8D +:104100000006AD001302F1EC5604005800008001D7 +:10411000005900010000D82E010D02F1EC560300F9 +:1041200000000100EF4C09B0C628089CE0A070A672 +:1041300014981699300AFC1BC01CE0A06ECD149296 +:1041400016930C9CE0A0709A04980699E0A070B4B5 +:10415000C0930A9CE0A0709204980699E0A070AE0B +:10416000CD23301B0C9CE0A061A9C412301B0A9C1B +:10417000E0A06198C3C3C87BEEFC0930EE0C002CB4 +:10418000F8F20524E0631DE0EA130000669B049C3E +:10419000E0A06194C0228792E063FFFEEA13BF7F34 +:1041A0000C9C069BE0A0618AC2220A9C069BE0A0B0 +:1041B0006179C1D3EF1C00F0EF5C00F43006EF56DC +:1041C00000F00A9CE0A0705A14921693089CE0A09C +:1041D00070553008FC19401CE0A06EB20498069996 +:1041E000E0A0706CFE93FF1FEF4609B0EEFC09B033 +:1041F000E3CD80FC800136B080013A9080011C94B0 +:1042000080011C7C80013A548001371880013A9467 +:10421000E06C136CEA1C0000F8FC09B05EFC0000C6 +:10422000EBCD40E000349D001302F1EC5604005940 +:1042300000008001005A000100004DE5010D02F16F +:10424000EC56030000000100201D3007E06CD13760 +:10425000EA1C80011A9B198AB68A199AB69A19AC77 +:10426000BAACE06600D43018FAC9FFFE30FAF7D6CF +:10427000C008301CE0A00B5C1BACE04C00D4C0E1DB +:10428000320CBA8C35FCBA9C30291A9AF7D6C00881 +:10429000301CE0A00B211897C0510E9C2FFDE3CDE0 +:1042A00080E0321CBA8C310CBA9C30291A9AF7D6AD +:1042B000C008301CE0A00B101897CF00322CBA8C2D +:1042C0003005BA9530291A9AF7D6C008301CE0A0FC +:1042D0000B031897CE30323CBA8CE06C007CEA1CA1 +:1042E0000000198CA7BCBA9C30291A9AF7D6C008CE +:1042F000301CE0A00AF11897CD10324CBA8C312C4A +:10430000BA9C30291A9AF7D6C008301CE0A00AE4FB +:104310001897CC40320CBA8CBA9530291A9AF7D635 +:10432000C008301CE0A00AD81897CB8BEBCD40809A +:10433000201D1A9C300BB88BB89B320CBA8C35FC04 +:10434000BA9CE06700D43029002A58001302F1EC2F +:104350005604005A00008001005B00010000F25E7C +:10436000010D02F1EC560300000001001A9AF7D784 +:10437000C008301CE0A00AC2C0412FFDE3CD808000 +:10438000321CBA8C310CBA9C30291A9AF7D7C00863 +:10439000301CE0A00AB3CF20322CBA8C300CBA9C6F +:1043A00030291A9AF7D7C008301CE0A00AA7CE60BF +:1043B000323CBA8CE06C007CEA1C0000198CA7BC73 +:1043C000BA9C30291A9AF7D7C008301CE0A00A9688 +:1043D000CD50324CBA8C312CBA9C30291A9AF7D76E +:1043E000C008301CE0A00A8ACC9B0000D401201D2C +:1043F0001A9C300BB88BB89B320CBA8C300CBA9C20 +:1044000030291A9AE06B00D4301CE0A00A772FFD07 +:10441000D8020000D401201D1A9C300BB88BB89B29 +:10442000320CBA8C300CBA9C30291A9AE06B00D44A +:10443000301CE0A00A632FFDD8020000EBCD40F84D +:10444000201D18931694E067D048EA1780011A9C43 +:104450000F8BB88B0F9BB89B3056E06500D430189B +:104460001A99327AF7D5C008301CE0A000823B00D0 +:104470001302F1EC5604005B00008001005C0001B7 +:104480000000E676010D02F1EC5603000000010089 +:104490000A73581CC1611B8CEDBC0003C122F1D40E +:1044A000C0080699E06A00A8F7D5C008301CE0A053 +:1044B0000A63C0E12FC70E9CE0A009E0300CC09851 +:1044C0000C9CFE3600015C7CCDB1300CC028301C49 +:1044D0002FFDE3CD80F8D70380006FE8EBCD40C01F +:1044E000201D1A9C300BB88BB89B320CBA8C36FC52 +:1044F000BA9CE06700D430291A9AF7D7C008301C5C +:10450000E0A00A0EC0412FFDE3CD80C0321CBA8C62 +:104510003006BA9630291A9AF7D7C008301CE0A0A6 +:1045200009FFCF20322CBA8CBA9630291A9AF7D7C5 +:10453000C008301CE0A009F4CE70323CBA8CE06CAC +:10454000007CEA1C0000198CA7BCBA9C30291A9A7E +:10455000F7D7C008301CE0A009E3CD60324CBA8C1C +:10456000340CBA9C30291A9AF7D7C008301CE0A046 +:1045700009D7CCABEBCD5EFF23ADE06BC864EA1B83 +:1045800080011A9C178AB88A179AB89AFACAFFF457 +:10459000009602001302F1EC5604005C000080015A +:1045A000005D000100008CCE010D02F1EC5603000D +:1045B00000000100169C2FEC1989B4891999B4994F +:1045C000FACAFFD8169C2FCCE06E00C0B909B528F6 +:1045D000208ECFD1300CBAACF6E800C4FAE9000462 +:1045E000F6E800CCFAE90010FACCFFE4FE3BFF2C21 +:1045F000B709B928170818A8E0A00836506CC81FDA +:10460000E06B0320406CE0A00B33C138301CBAAC27 +:10461000300C507C5081509143CC980CFB5C0010C6 +:1046200043CC981CFB5C001243CC982CFB5C001420 +:1046300032ECBA8C3001BA91E06700D430291A9A72 +:10464000F7D7C008301CE0A0097D1892C041049C37 +:104650005C6CC1A932ECBA8C33FCBA9C30291A9A32 +:10466000F7D7C008301CE0A0096D1892CF10E06B9E +:1046700000C8406CE0A00AFC3018FAC9FFF432FA16 +:10468000F7D7C008301CE0A009891892CE10FB3C77 +:10469000000CEDBC0007C033300CCF68E06800C0F0 +:1046A000FAC9FFD8E06A00A8F7D7C008301CE0A01C +:1046B0000975189200E078001302F1EC5604005DD1 +:1046C00000008001005E000100001905010D02F1EB +:1046D000EC56030000000100CCD030033000C028AD +:1046E0002FA0E06451ECEA141EB8E065EB85EA15F2 +:1046F0003F91E04000C0C5E4FACBFFD8000B179A09 +:10470000178CF9EA108ABA2A17BA17ACF9EA108A94 +:10471000BA3A17DA17CCF9EA108ABA4A2FF343ECFF +:10472000B8039A2CE0A05F76E0A06E0208980A9980 +:10473000E0A06D75E0A06E4743EBB61C9A360C9C6A +:10474000E0A05F68E0A06DF408980A99E0A06D67AA +:10475000E0A06E3943EBB62C9A470E9CE0A05F5A5E +:10476000E0A06DE614981699089A0A9BE0A06D5790 +:10477000E0A06E2943EBB63C9A2C407A180A507A96 +:10478000408B0C0B508B409B0E0B509B300CC02869 +:104790002FFC583CCA64FACBFFFCF60C041BFE3B12 +:1047A000F060E04B1F41CF53301C43BBB68C300C44 +:1047B000C7D89A2CE0A05F2EE0A06DBA08980A999D +:1047C000E0A06D2DE0A06DFF43CBB60C9A3CE0A0BD +:1047D0005F21E0A06DAD0898009D6F001302F1EC21 +:1047E0005604005E00008001005F00010000A6BECC +:1047F000010D02F1EC560300000001000A99E0A04F +:104800006D20E0A06DF243CBB61C9A4CE0A05F1483 +:10481000E0A06DA008980A99E0A06D13E0A06DE5F6 +:1048200043CBB62C1BAC581CFE91FF16FB0B0010A3 +:1048300043CC980C181BFB5B0010FB0B001243CC05 +:10484000981C162CFB5C0012FB0A001443CB962B21 +:10485000142BFB5B0014FB0A00102FCA589AC3529A +:104860005C8C2FCC589CC3125C8B2FCB589BC2D234 +:10487000FC173FA0407CE0A05EDFE0A06D6B30083D +:104880000E99E0A06CDEE0A06DB043DBB60C408C6E +:10489000E0A05ED2E0A06D5E30080E99E0A06CD181 +:1048A000E0A06DA343DBB61C409CE0A05EC5E0A089 +:1048B0006D5130080E99E0A06CC4E0A06D9643DB0A +:1048C000B62C301C43BBB68CA1A2049C5C6C2C6D36 +:1048D000E3CDCEFFEBCD40C0201D1A9C300BB88B32 +:1048E000B89B320CBA8C36FCBA9CE06700D43029F5 +:1048F0001A9AF7D7C008301CE0A008480014EB0053 +:104900001302F1EC5604005F00008001006000011A +:10491000000039D5010D02F1EC5603000000010042 +:10492000C3B0321CBA8C3006BA9630291A9AF7D71F +:10493000C008301CE0A0083CC2F0322CBA8CBA96F9 +:1049400030291A9AF7D7C008301CE0A00831C240BD +:10495000323CBA8CE06C00A0BA9C30291A9AF7D786 +:10496000C008301CE0A00824C170324CBA8C302C36 +:10497000BA9C30291A9AF7D7C008301CE0A0081852 +:10498000C0B032ECBA8CBA9630291A9AF7D7C00860 +:10499000301CE0A0080D2FFDE3CD80C0D431209D58 +:1049A000189016913007E06CCDBCEA1C80011A9B70 +:1049B000198AB68A199AB69AF8EA0004FAEB001036 +:1049C000F8EA000CFAEB001C30032ECCB90AFAEB23 +:1049D000000830043006300CBAAC506C3032303540 +:1049E000E0A00678501CC058305B401CE0A009765F +:1049F000049CFE32FF015C5CC050C7FF189758173B +:104A0000CF415817C0C030BC810C811C812C830C55 +:104A1000831C832C0E9C5C6CE08F022BE06B0320CC +:104A200000B9C9001302F1EC5604006000008001D7 +:104A30000061000100008564010D02F1EC560300E5 +:104A400000000100401CE0A0095BC068305B401C16 +:104A5000E0A009562FF65C6658A6C10430181A99D2 +:104A6000327AE06B00D4301CE0A007E01B8CE21C23 +:104A70000008BA8C1B8C580CCEA00A9CFE35FF0196 +:104A80005C5CC1303068FAC9FFF0E06A00A8E06BF6 +:104A900000D4301CE0A007CA18975817C060305BDC +:104AA000401CE0A0092DCEABFACCFFF0300A300B51 +:104AB000B91BC278FB3B0011FB3C0010F9EB108BDB +:104AC000BA4BFB3B0013FB3C0012F9EB108BBA5BBB +:104AD000FB3B0015FB3C0014F9EB108BBA6BFB2B76 +:104AE00000022FFBBAAB9A4C600B180B810B9A5C3F +:104AF000601B180B811B9A6C602B180B812B2FF4F9 +:104B00005C645854C4D43006C078305B401CE0A0CC +:104B100008F72FF32FF65C6658A6C10430181A99CF +:104B2000327AE06B00D4301CE0A007801B8CE21CC2 +:104B30000008BA8C1B8C580CCE905C5358A3C0C193 +:104B4000E06C00CC0082C7001302F1EC5604006157 +:104B50000000800100620001000010AF010D02F1B1 +:104B6000EC56030000000100810C811C812C830C99 +:104B7000831C832C0E9C5C6CC9F93035C058305BAB +:104B8000401CE0A008CF0A9CFE35FF015C5CC0E041 +:104B90003068FAC9FFF0E06A00A8E06B00D4301C6E +:104BA000E0A0075618975817CEB15817C960316C56 +:104BB000810C811C812C830C831C832C0E9C5C6CCF +:104BC000C7B9FB2B0002581B3004C2655C64583423 +:104BD000C264E0040027FB2C0002E0A05D6318968D +:104BE0006E0CE0A05D5F0C9BE0A05BF0E0A06BE8CA +:104BF000E06851ECEA181EB8E069EB85EA193FB1AC +:104C0000E0A06B55E0A06C278F0C2FF4CE0B300C7E +:104C1000E004092C2FF45C645834CFA5300CBAACF6 +:104C2000323CFB6C001CE06C00A2FB6C001DE062DF +:104C300000D43029FACAFFE4F7D2C008301CE0A043 +:104C400006DB18975817C0B0321C810C811C812CD0 +:104C5000830C831C832C0E9C5C6CC2E9364B401C7D +:104C6000E0A008603006C06800F6B8001302F1EC5E +:104C70005604006200008001006300010000AF14D0 +:104C8000010D02F1EC56030000000100305B401CF6 +:104C9000E0A0085A2FF65C6658A6C10430181A998D +:104CA000327AF7D2C008301CE0A006E41B8CE21C6C +:104CB0000008BA8C1B8C580CCEA03035C058305B25 +:104CC000401CE0A008410A9CFE35FF015C5CC0E08E +:104CD0003068FAC9FFF0E06A00A8F7D2C008301CBB +:104CE000E0A006C818975817CEB15817C0B032CCFC +:104CF000810C811C812C830C831C832C0E9C5C6C8E +:104D0000CED8FACCFFF0300A300BB91B3003300498 +:104D1000C368FB3B0011FB3C0010F9EB108BBA4B56 +:104D2000FB3B0013FB3C0012F9EB108BBA5BFB3B27 +:104D30000015FB3C0014F9EB108BBA6B9A4C5C4CE1 +:104D4000E04C0065C1B59A5C9A5B5C4BE04B00653A +:104D5000C1559A6B9A6A5C4AE04A0065C0F5FB2926 +:104D600000022FF9BAA99A4A620914098309621A42 +:104D7000180A831A622C160C832C2FF45C64585486 +:104D8000C4D43006C078305B401CE0A000E1F500E0 +:104D90001302F1EC5604006300008001006400017E +:104DA0000000BB3C010D02F1EC56030000000100C5 +:104DB00007DD2FF32FF65C6658A6C10430181A9948 +:104DC000327AF7D2C008301CE0A006661B8CE21CC9 +:104DD0000008BA8C1B8C580CCE905C5358A3C0C1F1 +:104DE000E06C00DD810C811C812C830C831C832CE6 +:104DF0000E9C5C6CC8583035C058305B401CE0A03D +:104E000007B50A9CFE35FF015C5CC0E03068FAC95A +:104E1000FFF0E06A00A8F7D2C008301CE0A0063C12 +:104E200018975817CEB15817C870337C810C811C65 +:104E3000812C830C831C832C0E9C5C6CC618FB2B72 +:104E40000002581B3004C2655C645834C264E2043A +:104E50000027FB2C0002E0A05C4918966E0CE0A035 +:104E60005C450C9BE0A05AD6E0A06ACEE06851EC0D +:104E7000EA181EB8E069EB85EA193FB1E0A06A3B89 +:104E8000E0A06B0D8F0C2FF4CE0B300CE204092C3C +:104E90002FF45C645834CFA5620C600B163CC055EF +:104EA000620B600C162CC048600B620C162C621B47 +:104EB000000D2A001302F1EC56040064000080018A +:104EC000006500010000D184010D02F1EC560300E1 +:104ED00000000100601A143BC055621A601B142BBD +:104EE000C048601A621B142B622A6029123AC0550E +:104EF0006229602A122AC0486029622A122AFE7991 +:104F0000FF51120CE04C02BDC0B2120BE04B02BDCF +:104F1000C072120AE04A02BDC032301C506C406CB4 +:104F20005C6C2F7DD832D70380006DB0800073B8E1 +:104F300080011D3880011A6080013A548001394295 +:104F400080013AEAD401198B580BC031C56CD802E4 +:104F5000198B581BC031C05CD802C17CD80200003C +:104F6000EBCD40C01897E0660AB8EA16000030188A +:104F70000C99326AE06B00D4301CE0A0059F0D8BC9 +:104F8000AE8BE3CD80C00000EBCD4080201D189794 +:104F90001A9C300BB88BB89B0F8CE21C00F0210CD4 +:104FA000C040230CC100C088300CE06B007CEA1BC1 +:104FB0000000B68CC0E8310CE06B007CEA1B0000FE +:104FC000B68CC078320CE06B007CEA1B0000B68C1B +:104FD000323CBA8C0016C4001302F1EC5604006592 +:104FE00000008001006600010000444F010D02F145 +:104FF000EC56030000000100E06C007CEA1C00009D +:10500000198CA7BCBA9C30291A9AE06B00D4301CCA +:10501000E0A0053AAE8C2FFDE3CD8080EBCD40F8CB +:10502000219D18973006E06BC9D8EA1B8001B708AC +:10503000FAE9005C300CFB6C0040F6E80008FAE985 +:105040000010F6E80010FAE90008F6E80018BB19AD +:10505000FACAFFB0169C2E0CB909B528190814A875 +:10506000FACAFFBC169C2D4CB909B528190814A81A +:10507000F6E80038FAE90038F6E80040FAE90030CE +:10508000F6E80048FAE90028F6E80050FAE90020BE +:105090002A8BB70AFAEB0018E06300D4E0650ABC7B +:1050A000EA15000030180A992F4930FAF7D3C008E2 +:1050B000301CE0A00515EB3C000CE04C00D4C0D146 +:1050C0003058FAC9FFA4E06A00A0F7D3C008301C2A +:1050D000E0A005061896C0510C9C2E7DE3CD80F80B +:1050E0001A99FACAFFF8FACBFFF0FACCFFC0FEB06B +:1050F000FAF7EB6C000FFACB00B50F001302F1ECDE +:105100005604006600008001006700010000FBF407 +:10511000010D02F1EC56030000000100FFBCFACCC7 +:10512000FFB0FEB0FCBBEB6C000E3004C138320C9B +:10513000AA8CFACCFFA4080C198CAA9C30290A9AD4 +:10514000F7D3C008301CE0A004B11896CD802FF42E +:105150005C545854CED5E0A0A985281C198C588CD5 +:10516000F9BC02082FECFE0C001FC098C398C6E8DB +:10517000CA88CDD8C179C4C9C869CC49414CFB5C47 +:105180000038415CFB5C003A416CFB5C003C411C1C +:10519000FB5C0030412CFB5C0032413CFB5C00348A +:1051A000FB0C0010FB5C0020FB0C0012FB5C0022DF +:1051B000FB0C0014FB5C00249A1CFB5C00189A2C6E +:1051C000FB5C001A9A3CFB5C001C9A4CFB5C0028C0 +:1051D0009A5CFB5C002A9A6CFB5C002CC939415C30 +:1051E000FB5C0038414C5C3CFB5C003A416CFB5C76 +:1051F000003C412CFB5C0030411C5C3CFB5C003201 +:10520000413CFB5C0034FB0C0012FB5C0020FB0CFF +:1052100000105C3CFB5C0022FB0C001400DE8100F3 +:105220001302F1EC560400670000800100680001E1 +:1052300000006C1F010D02F1EC560300000001009C +:10524000FB5C00249A2CFB5C00189A1C5C3CFB5C09 +:10525000001A9A3CFB5C001C9A5CFB5C00289A4C90 +:105260005C3CFB5C002A9A6CFB5C002CC5D9414C71 +:105270005C3CFB5C0038415C5C3CFB5C003A416C94 +:10528000FB5C003C411C5C3CFB5C0030412C5C3C0A +:10529000FB5C0032413CFB5C0034FB0C00105C3CCE +:1052A000FB5C0020FB0C00125C3CFB5C0022FB0C56 +:1052B0000014FB5C00249A1C5C3CFB5C00189A2CDC +:1052C0005C3CFB5C001A9A3CFB5C001C9A4C5C3C0E +:1052D000FB5C00289A5C5C3CFB5C002A9A6CFB5CE3 +:1052E000002CC229415C5C3CFB5C0038414CFB5CFF +:1052F000003A416CFB5C003C412C5C3CFB5C0030A8 +:10530000411CFB5C0032413CFB5C0034FB0C001296 +:105310005C3CFB5C0020FB0C0010FB5C0022FB0CE7 +:105320000014FB5C00249A2C5C3CFB5C00189A1C6B +:10533000FB5C001A9A3CFB5C001C9A5C5C3CFB5CCE +:1053400000FC84001302F1EC5604006800008001A8 +:105350000069000100002CA4010D02F1EC560300CD +:105360000000010000289A4CFB5C002A9A6CFB5C50 +:10537000002CCEC8414C5C3CFB5C0038415CFB5CC3 +:10538000003A416C5C3CFB5C003C411C5C3CFB5CBF +:105390000030412CFB5C0032413C5C3CFB5C003447 +:1053A000FB0C00105C3CFB5C0020FB0C0012FB5C67 +:1053B0000022FB0C00145C3CFB5C00249A1C5C3C4F +:1053C000FB5C00189A2CFB5C001A9A3C5C3CFB5C72 +:1053D000001C9A4C5C3CFB5C00289A5CFB5C002A3D +:1053E0009A6C5C3CFB5C002CCB18415CFB5C00388D +:1053F000414CFB5C003A416C5C3CFB5C003C412C4A +:10540000FB5C0030411CFB5C0032413C5C3CFB5CC3 +:105410000034FB0C0012FB5C0020FB0C0010FB5C5A +:105420000022FB0C00145C3CFB5C00249A2CFB5C0F +:1054300000189A1CFB5C001A9A3C5C3CFB5C001C4C +:105440009A5CFB5C00289A4CFB5C002A9A6C5C3CE2 +:10545000FB5C002CC7B8414CFB5C0038415C5C3CF9 +:10546000FB5C003A0093BF001302F1EC56040069A4 +:1054700000008001006A00010000B96F010D02F117 +:10548000EC56030000000100416C5C3CFB5C003CFE +:10549000411CFB5C0030412C5C3CFB5C0032413C1D +:1054A0005C3CFB5C0034FB0C0010FB5C0020FB0C44 +:1054B00000125C3CFB5C0022FB0C00145C3CFB5CBF +:1054C00000249A1CFB5C00189A2C5C3CFB5C001AC4 +:1054D0009A3C5C3CFB5C001C9A4CFB5C00289A5C90 +:1054E0005C3CFB5C002A9A6C5C3CFB5C002CC408B6 +:1054F000415C5C3CFB5C0038414C5C3CFB5C003A32 +:10550000416C5C3CFB5C003C412C5C3CFB5C003037 +:10551000411C5C3CFB5C0032413C5C3CFB5C00346D +:10552000FB0C00125C3CFB5C0020FB0C00105C3CA4 +:10553000FB5C0022FB0C00145C3CFB5C00249A2CFE +:105540005C3CFB5C00189A1C5C3CFB5C001A9A3CBF +:105550005C3CFB5C001C9A5C5C3CFB5C00289A4C4D +:105560005C3CFB5C002A9A6C5C3CFB5C002C3004CD +:10557000C2E8E80B1502E80C1501FACAFFC8180AC0 +:10558000940AFAC9FFB01609001D45001302F1EC98 +:105590005604006A00008001006B0001000006D480 +:1055A000010D02F1EC56030000000100930AFACA53 +:1055B000FFD0180A940AFAC9FFBCF20B090AFACB09 +:1055C000FFD8180B960BFACAFFF8180AB40BFACBDF +:1055D000FFE0180B960BFACAFFF0180AB40BFACBCF +:1055E000FFE8180B960B1A9A140CB81B2FF45C5496 +:1055F0005834CD25414CA94CAE8C414CAE9C415CFD +:10560000A94CAEAC415CAEBC416CA94CAECC416C7B +:10561000AEDC411CA94CAEEC411CAEFC412CA94CAB +:10562000EF6C0008412CEF6C0009413CA94CEF6C79 +:10563000000A413CEF6C000B9A4CA94CEF6C000C3B +:105640009A4CEF6C000D9A5CA94CEF6C000E9A5CC2 +:10565000EF6C000F9A6CA94CEF6C00109A6CEF6C19 +:105660000011FB0C0010A94CEF6C0012FB0C001099 +:10567000EF6C0013FB0C0012A94CEF6C0014FB0C38 +:105680000012EF6C0015FB0C0014A94CEF6C001617 +:10569000FB0C0014EF6C00179A0CEF6C00189A1CAE +:1056A000A94CEF6C00199A1CEF6C001A003C8800A2 +:1056B0001302F1EC5604006B00008001006C000145 +:1056C000000012FC010D02F1EC5603000000010085 +:1056D0009A2CA94CEF6C001B9A2CEF6C001C9A3C86 +:1056E000A94CEF6C001D9A3CEF6C001EFB2B004098 +:1056F000EF6B001FEB3C000FEF6C00202F250B8C95 +:105700002DF7AE8CFE9FFD56800070E48000708CFB +:105710008001BA44D401E0A0609BD80280012D7CB6 +:10572000D401E0A0610BD80280012E68D401E0A072 +:10573000615FD80280012F1CFE7C1000780CE9B05C +:1057400000055EFDFE7C1000780CE9B000025EFDF5 +:10575000FE7C1000780CE9B000015EFDFE7C1000BC +:10576000780CE9B000005EFDE06C054CEA1C00001E +:10577000F92B00005C5BC060202BC070201BC0A018 +:105780005EFDE07CC1385EFCE06C5A00EA1C0262FF +:105790005EFCE06C0E00EA1C07275EFCD401CE5FC5 +:1057A000A38CD802D401F80B0648E06A03E7300B5B +:1057B0001408F20B0049109A129BE06803E83009C4 +:1057C000E0A0A48E149CD802D401F80B0648EE7A0F +:1057D0000046EB001302F1EC5604006C000080015F +:1057E000006D000100007844010D02F1EC56030049 +:1057F00000000100423F300B1408F20B0049109AE0 +:10580000129BEE7842403009E0A0A47C149CD802A0 +:105810008001B60CE1BA0042970A760A140C971C74 +:10582000300C2F8BB68C5EFDE1BB0042F93A0008CC +:10583000582AC0215EFDF93A0008581AC0215EFFBF +:10584000781A7809123A780AC0A2143B5E2D781AA9 +:10585000163A5E2D301B2F8CB88B5EFF143BCFB3F6 +:10586000CF7B0000D401203DCB0F1A9BCD4F1A9C5B +:10587000CDCFCFE02FDDD80AD401203DCB8F1A9BAE +:10588000CCAF1A9CCD2FCFE02FDDD80AE06C1FF4EF +:10589000EA1C0000300A300B18983199B12A2019FF +:1058A000CFE15EFCE06C1FF4EA1C00005EFC00002F +:1058B000EBCD40C0CECF18973006E06C20BCEA1C80 +:1058C0000000B886B896B8A6B826E0A016330E9C9D +:1058D000C2CC0E9CC24C0E9CC76C0E9CE0A002D6A3 +:1058E0000E9CC75C0E9CC27C0E9CC3BCE0A001D287 +:1058F000E0A036E400AAA9001302F1EC5604006D02 +:1059000000008001006E00010000ED8F010D02F12A +:10591000EC56030000000100346CE0A09789343C91 +:10592000E0A09786EF66002AEF66002BEF66002C5A +:105930002D37AE86E3CF90C080009A3C8000DBC458 +:10594000D401300B998B999BC96CD802D401E0A08B +:105950003501DA0A8000D838EBCD40C018973016F0 +:105960006E8C5C6CE0A0348EC045301C8F5CC048EF +:10597000300C8F5C30060C9C5C5CE3CD80C0D703A0 +:105980008000D768EBCD40C0189730166E8C5C6CE9 +:10599000E0A034B6C045301C8F6CC048300C8F6C12 +:1059A00030060C9C5C5CE3CD80C0D7038000D7E45C +:1059B000EBCD40C018973016E0A035E6300B581CF0 +:1059C000C051301C8F3C8F2BC098582C8F3BC0414E +:1059D000301C8F2CC0388F2B30060C9C5C5CE3CDC8 +:1059E00080C0D7038000DA6CD401E0A03691DA0AD7 +:1059F000D401E0A09FF3DA0A8001AEC0D401300BDD +:105A0000E06A1FF4EA1A000074395809C030301BEC +:105A1000C058742A580AC020003D29001302F1EC36 +:105A20005604006E00008001006F00010000523437 +:105A3000010D02F1EC56030000000100302B581C50 +:105A4000C265189A20AAC08020AAC0B0228AC0E0ED +:105A5000278AC110C1685C6B30ACE0A03787C148B1 +:105A60005C6B314CE0A03782C0F85C6B33CCE0A0BB +:105A7000377DC0A85C6BE06C00B4E0A03777C0480D +:105A80005C6BE0A03773E0A037B9DA0AE0A037A674 +:105A9000DA0AD7038000DE2CEBCD40801897301C4B +:105AA0006E9B580BC1516E8C580CC041E0A037C2A0 +:105AB000C0586E8C5C5CE0A037C7300B5C5C581C37 +:105AC000C051301A8F0A8F1BC0E88F0BC0C8300B33 +:105AD0006E9A581AC051301A8F1A8F0BC0488F1BFC +:105AE0008F0B300C5C5CE3CD8080D7038000DEF44C +:105AF0008000DF08EBCD40E0189730066E858F8B75 +:105B0000CCCFC0700E9CC3BF0E9CC4FF3016C048E3 +:105B10008F850E9CCC2F0C9C5C5CE3CD80E000005C +:105B20005EFF0000EBCD40C0240D18971A9C300892 +:105B30003009320BB928201BCFE1CD9E0080F80040 +:105B40001302F1EC5604006F0000800100700001A8 +:105B50000000425C010D02F1EC5603000000010060 +:105B60001896ED3C005BE04C0064C2B4FACAFEF447 +:105B70000E9B1A9CE0A0A2441A9CE0A0A4C52FFC96 +:105B8000ED3B005B180BE04B0065C055ED3C005B46 +:105B9000F80C116430AB1A9A180A201AB48B1A9AAE +:105BA000ED39005B0C092A49189B129E580BC05016 +:105BB0001538201B1CC8CFD12A560D8B180BAC8B67 +:105BC0002C0DE3CF80C0D7038001B49C8001B9A421 +:105BD000D401C9FE189B2A4B30091698364A10C9C1 +:105BE000201ACFE1300B2A5CB88BD80AEBCD40C02D +:105BF000207D1897A15B502B300CFB6C0010505A85 +:105C0000506930260E9BE06C1FF4EA1C0000C7DCD4 +:105C1000FACBFFF8FE7C4400FEB0FDD2C035301C4C +:105C2000C0F80E9B189ABB1BE06CCFF4EA1C8001F5 +:105C3000C8CF0C9CFE36FF015C5CCE51300C2F9D12 +:105C4000E3CD80C0EBCD40C0207D1897A15B502BE9 +:105C5000301CFB6C00105068503A505930260E9B97 +:105C6000004909001302F1EC5604007000008001A5 +:105C700000710001000056E1010D02F1EC56030035 +:105C800000000100E06C1FF4EA1C0000C50CFACB18 +:105C9000FFF8FE7C4400FEB0FD99C035301CC0F812 +:105CA0000E9B189ABB1BE06CCFE8EA1C8001C5FF75 +:105CB0000C9CFE36FF015C5CCE51300C2F9DE3CD79 +:105CC00080C00000EBCD40FC202D18971493129655 +:105CD0001094A15B169230250E9BE06C1FF4EA1C19 +:105CE0000000C25CE80C15185F1804990C9A069B1A +:105CF000FE7C4400FEB0FD70C035301CC0F80E9B29 +:105D0000189ABB1BE06CCFD0EA1C8001C30F0A9C21 +:105D1000FE35FF015C5CCE11300C2FEDE3CD80FC35 +:105D2000D401E0A09DF1D80A8001AD80D401793A78 +:105D3000581AC041300BC11CD80A580BCFC0581B91 +:105D4000CFA0582BCF80583BCF60584BCF40585BEB +:105D5000CF20301BC02CD80AEBCD40801897D3033E +:105D6000580BC0A16EFC581CC111301CE0A032D2EF +:105D7000300C8FFCC0B8581BC0916EFC580CC06131 +:105D8000300CE0A0005C8F001302F1EC56040071AF +:105D900000008001007200010000C32A010D02F121 +:105DA000EC5603000000010032C7301C8FFCD50305 +:105DB000E3CF80808000D78CEBCD40C0201D1897AA +:105DC000301CEF4C004CE066CE44EA1680011A9C71 +:105DD0000C9B3039173A18CA2019CFD130391A9A8A +:105DE000320B307CC28FC0502FC60C9CCD2EC07899 +:105DF000300CEF4C004C2F460C9CCCBE2FFDE3CF5B +:105E000080C00000D421189730053006C1380A9BA5 +:105E1000FE35FF015C5BC4E1580CC091EF1C0040F3 +:105E2000301BF606094B168CEF5C004030052FF650 +:105E30005C6658A6C5845836C141FEB0FD8F793CDA +:105E4000581CC0F1EF1C0040A3DCEF5C0040300C9C +:105E5000E06B3828EA1B0000763B2F2BB68CCE8BEC +:105E60005876C281FEB0FD7A793C581CC071E0A022 +:105E7000A2E3301CEF4C00C0C1D8E0A0A2DDE0647A +:105E80003828EA140000687C78BCF01C0000C0D000 +:105E9000EF1C0040A7BCEF5C0040301CEF4C00C082 +:105EA000687B2F2BB68CCC4B002E06001302F1EC36 +:105EB00056040072000080010073000100007C9114 +:105EC000010D02F1EC56030000000100E0A0A2D297 +:105ED000300CEF4C00C0E0643828EA140000E806FB +:105EE0000024680C78BCF01C0000581CCA31EF1A62 +:105EF0000040301BF606094B164AEF5A0040301B93 +:105F0000680A2F2AB48BC9BB30ACC18858ACC061B9 +:105F1000EF1B0040ABABEF5B004058BCC061EF1B18 +:105F20000040ABBBEF5B004058CCC061EF1B0040B2 +:105F3000ADABEF5B00402FFC5C6C58DCCE85301CB9 +:105F40002BE7AE8CD82AD7038001B88C8001B8A487 +:105F50002CDCB88B5EFD0000D401FEB0FC73D80AC7 +:105F6000D401E0A033C9D80A8000DB28D401FEB0F8 +:105F7000FC63D80AD401FEB0FC71D80AD401FEB08B +:105F8000FC67D80AEBCD40801697FEB0FC87189BC3 +:105F90000E9CFEB0FCD5E3CF80800000EBCD4080AE +:105FA0001697FEB0FC7B189BEE0C100AFEB0FCD2DC +:105FB000E3CF8080D4012D6CB88BC03CD80A0000A0 +:105FC000EBCD40C0216DFEB0E2C9189700AB2500B3 +:105FD0001302F1EC5604007300008001007400010C +:105FE000000068B9010D02F1EC5603000000010049 +:105FF000FEB0FCD81896E0A0A31F300CFB5C005448 +:10600000FB6C002D30ABFB6B002EFB6C0030FB6C8F +:1060100000312D660D8C580CC1705807C2A0300C91 +:10602000FB6C002C305CFB6C002D30BCFB6C002E3C +:10603000FACCFFD41A9B32C9190A16AA2049CFD12B +:10604000E0A070B8C1685807C140301CFB6C002C40 +:10605000305CFB6C002D30BCFB6C002EFACCFFD406 +:106060001A9B32C9190A16AA2049CFD1E0A070A202 +:106070002EADE3CF80C0D7038000398C800155C09E +:10608000D401348CE0A0941E320CE0A0A19F348C8B +:10609000E0A0943AD80A0000D401348CE0A0941215 +:1060A000320CE0A0A1AF348CE0A0942ED80A0000FE +:1060B000D401348CE0A09406321CE0A0A187348C7B +:1060C000E0A09422D80A0000D401348CE0A093FA16 +:1060D000321CE0A0A197348CE0A09416D80A0000EE +:1060E000EBCD40801897348CE0A093EC0E9CE0A0A0 +:1060F000002E75001302F1EC5604007400008001BC +:106100000075000100000201010D02F1EC560300D0 +:1061100000000100A16D348CE0A09408E3CF8080E2 +:106120008001B7D8EBCD40801897348CE0A093DC89 +:106130000E9CE0A0A179348CE0A093F8E3CF80809E +:1061400080019CD08001B81080019D14D401E0A092 +:10615000335DD80A8000DBF4D5035EFDD401581C02 +:10616000C041E0A034B7D80AE0A034A4D80AD703CD +:106170008000DEBC8000DE9C2D6C198C5EFC000073 +:106180002D0CB88B5EFD00002D0C198C5EFC000000 +:106190002CECB88B5EFD00002CEC198C5EFC000032 +:1061A0002D1C198C5EFC0000D401F96B002F5C5B88 +:1061B000C031301BC3ECD80A2D2C198C5EFC0000BA +:1061C0002D2CB88B5EFD00002CFC198C5EFC0000B1 +:1061D000F96B0031580B5E0DF92B005A2FFBF96B50 +:1061E000005AF92B005AE04B00655E5D364B2A6C75 +:1061F000B88B5EFD2BAC198C5EFC00002BACB88B11 +:106200005EFD00002CCCB88B5EFD00002C8CF92BC1 +:106210000000169C00835A001302F1EC560400752E +:106220000000800100760001000097CA010D02F114 +:10623000EC560300000001005EFC00002C8CB88BC3 +:106240005EFD00002C7C198C5EFC00002C7CB88B61 +:106250005EFD0000EBCD408018975C5BC091301B69 +:10626000CD4E2C678E8C2FFCAE0CE3CF8080300C93 +:106270002C67AE0CE3CF80802C6C988C5EFC000009 +:10628000D4015C6A5C6CE0A0332BD80A8000DCA4EB +:106290002ADCB88B5EFD00002ADC198C5EFC000055 +:1062A000EBCD40C018973006C8EFC02030160E9CCA +:1062B000CF4FC080301CEF3B0053F80B094C184601 +:1062C0005C760E9CC94FC030A3A65C760E9CCA5F5C +:1062D000C030A5A65C760C9C5C7CE3CD80C0000041 +:1062E000EBCD40E0202D18973005300CBA8CE066DD +:1062F000CD44EA1680010C9C2F8CFEB0FC930E9CC2 +:10630000C76FC780300CBACC3018FAC9FFFC300A0E +:10631000E06B008C305CFEB0FD03C0B01BCCEDBC6C +:106320000000C0720C9C2F4CFEB0FC7C301CBA8C60 +:106330001B8C580CC630301B006C88001302F1EC2B +:1063400056040076000080010077000100002871EB +:10635000010D02F1EC560300000001000E9C2BCC55 +:10636000E06A3828EA1A0000745A74BA745A5D1A3E +:10637000E0A0A1981895EF3C0044500C0C9C2F0C09 +:10638000FEB0FC62EF3C00C5580CC251EB3C0082F1 +:10639000EF3B0044163CC0D20C9CFEB0FC55301CB8 +:1063A000EF6C0043EB3B0083E06C00FFC42CC32880 +:1063B000EF3C0044EB3B0083163CC2C22FD60C9C42 +:1063C000FEB0FC42300CEF6C0043300BEB3C008223 +:1063D000C30CC208EF3C0044E04C0079C0C50C9CE3 +:1063E000FEB0FC32301CEF6C0043364BE06C00FF1B +:1063F000C20CC108EF3C0044E04C0064C0B42FD68E +:106400000C9CFEB0FC21300CEF6C0043300B378C41 +:10641000C10C3015C0582E860C9CFEB0FC15300BFC +:106420000E9CCFBE0A9C5C5C2FEDE3CD80E00000AB +:10643000EBCD40C0201D16971A9B300AB68AB69A3B +:10644000308BBA8BBA9CE066008C30291A9AF7D64A +:10645000C008305CFEB0FC4AC031300C005734003C +:106460001302F1EC5604007700008001007800016F +:106470000000BF9A010D02F1EC560300000001007C +:10648000C0D8309CBA8CBA9730291A9AF7D6C0086F +:10649000305CFEB0FC3DCF40301C2FFDE3CD80C012 +:1064A000EBCD40801897CDDEC0A0301A300B304CB9 +:1064B000C0CF300B0E9CCD9EE3CF9080E3CF808089 +:1064C000EBCD40E0189616973005C4FCC1500C9CEB +:1064D000C50CC3600E77C0402017C060C0883F4C19 +:1064E000FEB0FBC2C0483F3CFEB0FBBE3015301BC7 +:1064F0000C9CCD5EC258E0A0A0E729AC988C580C4B +:10650000C1F10C9CC70EC050E0A0A0DE292C988CD5 +:106510000C9CCD7EE06B9C40F60C1900C0E30E771E +:10652000C0402017C060C0883F4CFEB0FB9DC048F3 +:106530003F3CFEB0FB993015300B0C9CCB0E0A9CF7 +:106540005C5CE3CD80E00000D401581BC095301A9C +:106550002B9CB88AF9DBC010FEB0FB06D80A300BC2 +:10656000F96B0047C0ACD80A2B9C198C5EFC00006C +:106570002B8C198C5EFC0000EBCD40E01897169632 +:1065800000E9E3001302F1EC5604007800008001FA +:10659000007900010000FF21010D02F1EC5603001B +:1065A00000000100EC0C1518C0B1E0A0A09F1895E8 +:1065B000300B0E9CC42E29258A8CFEB0FAE72B875F +:1065C000AE86E3CF80E0D7038001BA44EBCD40C074 +:1065D000201D1897C6EEC3A13006300CBA0C0E9CD5 +:1065E000FEB0FE145C6CFEB0D453C200FEB0D4E426 +:1065F000E04C00C8C030FEB0D4E5FEB0FDA9300BC1 +:106600000E9CFEB0FE070E9CFEB0FE08C0D19A8B19 +:106610002FFBBA0B300B0E9CCA8D1896C0519A8C6A +:10662000E04C9C40CF15FEB0FD875806C0509A8CB8 +:10663000E04C9C40C045300CEF6C0057300CEF6CC8 +:106640000051300B0E9CFEB0FDE52FFDE3CF80C066 +:1066500080002310EBCD40F8202D18971696301CA3 +:10666000BADC3004300CBA3CBACCBACCC0481BCB34 +:106670002FFBBACB1BCC58ACC084EF1C00661BCBE5 +:10668000F80B0A4CA19CCF42E065CD24EA158001AD +:106690001BCC500C0A9CFEB0FAFB1BCC58ACC06162 +:1066A0002F850A9C00DDB7001302F1EC5604007937 +:1066B00000008001007A000100006AEA010D02F189 +:1066C000EC56030000000100FEB0FAF4CBF83003F2 +:1066D000C128EF1C005CF8030A4CA19CC0A2E06C2E +:1066E0003828EA1C0000F803032C78BC782C5D1CC9 +:1066F0002FF35C5358A3CEE5EF1C0066EDBC0005FC +:10670000C0A3EF1C0066EDBC0008C053E06B13880B +:106710000C9CC3FF1BDC580CC6A00E9CE0A032B83A +:10672000C4D0300CFEB0D3C6C620FEB0D45DFEB0DF +:10673000FD21300B0C9CFEB0FD7FC118ED3C0055D7 +:10674000581CC0C1FEB0FD0A301B0C9CFEB0FC9A68 +:10675000FEB0FD10300CED6C00552FF45C54583435 +:10676000C2340C9CFEB0FD6CC101301B0C9CFEB011 +:10677000FC899ABB2FFBBA3B300B0C9CCC6EC051F2 +:106780009ABCE04C1388CEE50C9CC17FC0D1ED3C97 +:106790000055580CC051FEB0D44D581CC0509ABC86 +:1067A000E04C1388CCC5FEB0FCD9300CED6C005128 +:1067B000300B0C9CFEB0FD40C1A80C9CFEB0FD400F +:1067C000C101301B0C9CFEB000AB7F001302F1EC4A +:1067D0005604007A00008001007B00010000D551C2 +:1067E000010D02F1EC56030000000100FC5D9ABBB4 +:1067F0002FFBBA3B300B0C9CC9AEC0519ABCE04C8D +:106800000BB8CEE51BCC500C0A9C2F0CFEB0FA64E2 +:106810003004EF5400663003C128EF1C005CF8031D +:106820000A4CA19CC0A2E06C3828EA1C0000F803C6 +:10683000032C78BC781C5D1C2FF35C5358A3CEE569 +:106840001BCC500C2E850A9CFEB0FA46300CC0685A +:10685000EE0C001B28EBB6042FFC5C6C586CCF953B +:10686000300B0C9CCA8E300B0C9CFEB0FD4B2FEDF8 +:10687000E3CF80F88000DFC4800021E88000231C83 +:1068800080002368EBCD40E0189730063005C158F2 +:10689000E06C3828EA1C0000F805032C78BC782C42 +:1068A0005D1CC090EF1C0040301BF605094B168C98 +:1068B000EF5C00402FF55C655885CEB52C078E8CBB +:1068C000580CC02130160C9C5C5CE3CD80E00000CD +:1068D000D4211894169614970C9CFEB0FD3D189583 +:1068E000ED3C0039581CC0D1E06CD0BC00F1740004 +:1068F0001302F1EC5604007B00008001007C0001D3 +:106900000000C179010D02F1EC5603000000010006 +:10691000EA1C8001FEB0F9F2300CFEB0FC9F0C9B2B +:10692000089CCCFE5805C2F0EDB50000C052300BFB +:106930000C9CFEB0FCB9EDB50002C1020C9CFEB08F +:10694000FD3DF9D5B008E0A041FFF9D5B008E0A0C1 +:106950002AC35817C0310C9CC70E0A9CE21C0018B1 +:10696000590CC0D1EE0C1518C0305837C0810C9CA2 +:10697000FEB0FDE0F9D5B008E0A02AAE300B0C9CCB +:10698000FEB0FCF4D82AD703800100348000D1C4C3 +:10699000EBCD40801897300CEF6C0056EF6C005731 +:1069A000303BEF6B0032EF6C0051301B0E9CFEB0A1 +:1069B000FC67EF1C003A580CC050301B0E9CFEB018 +:1069C000FCB7301CEF6C00550E9CFEB0F8D9E3CD3F +:1069D00080800000EBCD40E0202D18971695300602 +:1069E0000A9C187CC040201CC270C4D8E06C20C433 +:1069F000EA1C0000EF2B0051581BC0A198BB2FFBD5 +:106A0000B83B98BCE04C9C40C2653016C3C898ABFC +:106A1000004C0C001302F1EC5604007C00008001D5 +:106A2000007D00010000ABC1010D02F1EC56030036 +:106A3000000001002FFBB82B98BB2FFBB83B98AC94 +:106A4000E04C9C40C1A5EF3C00572FFCEF6C005779 +:106A5000301CEF6C00543026C288E06C20C4EA1C65 +:106A60000000EF3B0032582BC0D1989B2FFBB81B86 +:106A7000989CE04C9C40CDC4301B0E9CFEB0FB4467 +:106A8000C148988B2FFBB80B989B2FFBB81B988C99 +:106A9000E04C9C40CF25EF3C00562FFCEF6C00569D +:106AA000301CEF6C00543026EF3C0054580CC301EE +:106AB0000A75C0402015C1C0C508EF2C0051582CE4 +:106AC000C0305816C4A13005EF650057E06C20C4F3 +:106AD000EA1C0000B825B835EF3C0030580CC3D193 +:106AE000301B0E9CFEB0FBDE2AF7AE85C368EF3C80 +:106AF0000032583CC0305816C30130052AA7AE8575 +:106B0000E06C20C4EA1C0000B805B815C268EF3C70 +:106B10000054580CC220EF3C0056581CC054EF3CA7 +:106B20000057581CC175EF3A0057EF3B0056BB1B8E +:106B3000E06CCFA0005DF4001302F1EC5604007D80 +:106B400000008001007E000100003E0A010D02F1FC +:106B5000EC56030000000100EA1C8001FEB0F8F2D0 +:106B60000E9CC3BFE06C20C4EA1C00003005B825B1 +:106B7000B835B805B815300C2AC7AE8C0C9C2FED73 +:106B8000E3CD80E0EBCD4080E0A0039AE0A00406D6 +:106B90003007C0E8F3D7C008300A300B300CE0A053 +:106BA0000777F7D7C008305CE0A007802FF75C5765 +:106BB00059E7CF15300CE06B3A8CEA1B0000F76CFC +:106BC00001ACF74C01B8F74C01BCF74C01C0F74CD5 +:106BD00001C4300AF74A01C8F74A01CCF74A01D08C +:106BE000305AF76A01B130AAF76A01B0F76C01AD0B +:106BF000F76C01AEF74C01B4F76A01B2F76C01AF64 +:106C0000E3CF8080E06B3A8CEA1B0000F76C01AFA9 +:106C10005EFD0000D431409240A340B6E0673A8C5C +:106C2000EA170000EF3C01AF581CC0313005C02806 +:106C30003055EF3401AC59E4C144F3D4C0080C9A88 +:106C4000069B049CE0A00724F7D4C008F9D5C0082F +:106C5000E0A0072CEF3C01AC000543001302F1EC6F +:106C60005604007E00008001007F0001000081B119 +:106C7000010D02F1EC560300000001002FFCEF6C47 +:106C800001ACC2783004C188E80C1502EE0C000B90 +:106C9000F3D4C008F6FA00F477FB0E0C781CE0A0E1 +:106CA0000709F7D4C008EE04000CF93C018DE0A000 +:106CB000070F2FF45C5459D4CE8531D90C9A069B1A +:106CC000049CE0A006F731DBF9D5C008E0A007007E +:106CD0005835C104EEFC01BC2FFCEF4C01BCEEFCAE +:106CE00001BCEE5C4241C143EE7C4240EF4C01BC32 +:106CF000C0F8EEFC01B82FFCEF4C01B8EEFC01B877 +:106D0000EE5C4241C053EE7C4240EF4C01B8E0A043 +:106D1000062D1893E0A005EE1894E0A00363EEFCA6 +:106D200001B8E0A05DC93008FC194034E0A05CC99E +:106D3000E0A05D971896EEF001C4009CE0A05DBC59 +:106D40003008FC194034E0A05CBCE0A05D8A1892D9 +:106D5000EF3C01B020ACC04020ACC550C748E0615A +:106D6000999AEA113F19069C029BE0A04E53C1027A +:106D7000089C029BE0A04E4EC0B2583500D98D0051 +:106D80001302F1EC5604007F000080010080000136 +:106D900000003CDA010D02F1EC5603000000010096 +:106DA000C094314CEF6C01B0A190009CE0A004466F +:106DB000C5C8EEFC01C42FFCEF4C01C4EEFC01C4BD +:106DC000EE5C4241C053EE7C4240EF4C01C458455A +:106DD000C4C5E0A002A5EEFC01B4581CC461E046A5 +:106DE00003E9C433EEF40184301B089CE0A04E1884 +:106DF000C032EE148000FC134220089C069BE0A0E9 +:106E00004E0FC0F2EEF40188301B089CE0A04E0843 +:106E1000C032EE148000089C069BE0A04E01C253D5 +:106E2000300CEF4C01B4C218E061999AEA113F1995 +:106E3000069C029BE0A04DF4C062089C029BE0A06F +:106E40004DEFC05330ACEF6C01B0C0F8EEFC01C0A8 +:106E50002FFCEF4C01C0EEFC01C0EE5C4241C05380 +:106E6000EE7C4240EF4C01C03004EF6401ADEF3CDA +:106E700001B1202C5C5C585CF9BC0205FE0C001CC6 +:106E800098CC180F000E010C004001FA023402F0F9 +:106E90005835C154EEFC01BC581CC061EF3C01B038 +:106EA00000701A001302F1EC56040080000080010B +:106EB0000081000100007049010D02F1EC56030051 +:106EC00000000100EF6C01B2C67958ACE0810165A9 +:106ED000304CEF6C01B1E0A00435EF4401B8C5C9F6 +:106EE000EF4401BCC599EEFC01B4581CC351EF3C02 +:106EF00001B0C67D581CC301E04603E9C0825806B4 +:106F0000C060EF3C01AEEF6C01ADC268E04203E946 +:106F1000C0325802CF71EEF50184301B0A9CE0A00C +:106F20004D91C032EE158000FC1342200A9C069B56 +:106F3000E0A04D94C0F2EEF50188301B0A9CE0A061 +:106F40004D81C032EE1580000A9C069BE0A04D8664 +:106F5000CD93EF4401B4EEFC01B4580CC191E0466E +:106F60000191C0825806C060EF3C01AEEF6C01ADEC +:106F7000C0F8EF3C01AE580CC060E04200FBC032EC +:106F80005802CF31EF3C01B0C5EDEF6C01AD303CA4 +:106F9000EF6C01B1EF3C01ADEF6C01AEEF4401B815 +:106FA000EF4401BCEF4401C0EF4401C4E0A0034C36 +:106FB000CF385845C235EEFC01B8581CC041E0A09E +:106FC0000223CEA80066AC001302F1EC5604008147 +:106FD00000008001008200010000E582010D02F145 +:106FE000EC56030000000100EEFC01B8586CE08391 +:106FF00000E6300BEEFC01B8E0A002F4EF3C01AE7D +:10700000583CC041EF4401B4C058E0A00545EF4CE6 +:1070100001B4302CEF6C01B1EF4401BCCCF8EF446B +:1070200001B8EF3C01B058ACC4B1EEFC01C458AC9F +:10703000E08300C5300BE0A002D5EF3C01AEE0A03C +:10704000052BEF4C01B4EEF601D4301B0C9CE0A0F4 +:107050004D0B0C9CC032EE1C80003015EA153FC071 +:107060000A9BE0A04D01E08300AAEEF301D8301B9B +:10707000069CE0A04CF9069CC032EE1C80000A9BE6 +:10708000E0A04CF2E083009B301B069CE0A04CEC9F +:10709000C032EE138000301B0C9CE0A04CE5C032E7 +:1070A000EE168000069C0C9BE0A04CEAE082008774 +:1070B000305CEF6C01B1CB9DEF4401C0C7F8EF44E9 +:1070C00001C4C7C8EEFC01B8586CCA42EEFC01C04E +:1070D000581CC0A1EEFC01C4E0A002D4EF3C01B0FA +:1070E000EF6C01B2C6B8585C007EA8001302F1EC48 +:1070F00056040082000080010083000100005A391C +:10710000010D02F1EC56030000000100C693EEFCF5 +:1071100001BC585CC653306CEF6C01B1EF4401B850 +:10712000C5F8EF3C01B0594CC5B1EEFC01B4581C98 +:10713000C301E04603E9C0825806C060EF3C01AEDF +:10714000EF6C01ADC268E04203E9C0325802CF7172 +:10715000EEF50184301B0A9CE0A04C98C032EE157D +:107160008000FC1342200A9C069BE0A04C9BC0F2CE +:10717000EEF50188301B0A9CE0A04C88C032EE1569 +:1071800080000A9C069BE0A04C8DCD93EF4401B497 +:10719000EEFC01B4580CC151E0460191C082580682 +:1071A000C060EF3C01AEEF6C01ADC0B8E0420191B0 +:1071B000C0325802CF71EF3C01B2C69CEF6C01ADFA +:1071C000303CEF6C01B1EF3C01ADEF6C01AEEF4430 +:1071D00001B8EF4401BCEF4401C4EF4401C0EF3CEF +:1071E00001AD581CC031301CC0A8582CC031302C07 +:1071F000C068583CC031303CC028300C5C5CD83290 +:1072000080013B3880013AE2EBCD40E000E1EB0049 +:107210001302F1EC56040083000080010084000199 +:1072200000004E11010D02F1EC56030000000100B8 +:10723000300B58ACC0C1E06A3A8CEA1A0000F4FC8A +:1072400001C8F4F601CCF4F501D0C128594CC0C1F5 +:10725000E06A3A8CEA1A0000F4FC01DCF4F601E082 +:10726000F4F501E4C058300C30063005303B5C5B6F +:10727000583BC194E067999AEA173E99E0A0048AC6 +:107280000E9BE0A04C21C1120C9CE0A004830E9B3D +:10729000E0A04C1AC0A20A9CE0A0047C0E9BE0A0D7 +:1072A0004C13C032300CC028301C5C5CE3CD80E055 +:1072B000EBCD40F8300B58ACC0D1E06C3A8CEA1CF6 +:1072C0000000F8F501C8F8F401CCF8F301D030065D +:1072D000C168594CC101E06C3A8CEA1C0000F8F519 +:1072E00001DCF8F401E0F8F301E4E066999AEA16AB +:1072F000BE99C058300530043003303B5C5B583BCE +:10730000C4640C9C0A9BE0A04BDFC112E067CCCCAC +:10731000EA17BDCC089C0E9BE0A04BD6C082069C11 +:107320000E9BE0A04BD1C032302BC3180C9C0A9BA3 +:1073300000967E001302F1EC5604008400008001E8 +:1073400000850001000024A9010D02F1EC560300A4 +:1073500000000100E0A04BCAC112E067CCCDEA17E3 +:107360003DCC089C0E9BE0A04BB5C083069C0E9BB9 +:10737000E0A04BB0C033301BC1C80C9C0A9BE0A0FE +:107380004BB5C092E06BCCCDEA1B3ECC069CE0A096 +:107390004BA1CF220C9C0A9BE0A04BA8C092E06BB3 +:1073A000CCCCEA1BBECC069CE0A04BA0CD03303B6E +:1073B000169C5C5CE3CD80F8E06C3A8CEA1C000023 +:1073C000300BF94B0168F94B016CF94B01705EFD14 +:1073D000EBCD40FEE0673A8CEA170000EEFC01744A +:1073E000300BE0A09905C191EEFC0178300BE0A0D4 +:1073F00098FFC131EEFC017C300BE0A098F9C0D1C0 +:10740000EEFC0168EF4C0174EEFC016CEF4C01786E +:10741000EEFC0170EF4C017CEEF40168EEFB0174B0 +:10742000089CE0A04911CF3C1892EEF5016CEEFBF0 +:1074300001780A9CE0A04908CEAC1893EEF60170E2 +:10744000EEFB017C0C9CE0A048FFCE1C1891EEFCEA +:107450000180049B002442001302F1EC56040085D5 +:1074600000008001008600010000B162010D02F100 +:10747000EC56030000000100E0A04966CDACEF4CE3 +:107480000180EEFC0184069BE0A0495ECD2CEF4C10 +:107490000184EEFC0188029BE0A04956CCACEF4C85 +:1074A0000188EF440174EF450178EF46017CE3CF9A +:1074B00080FED7038001B798E06C3A8CEA1C00008C +:1074C000300BF94B0180F94B0184F94B0188F94BE2 +:1074D0000174F94B0178F94B017C5EFDEBCD40FB6B +:1074E000205D31DBFACCFFF8E0A00352402CBFDC7A +:1074F000E066D70BEA163D230C9BE0A04B09C03297 +:10750000300C502C4037301B0E9CE0A04AF5C032A6 +:10751000EE1780000E9C0C9BE0A04AFAC032300CA3 +:10752000503C4047301B0E9CE0A04AE6C032EE17AC +:1075300080000E9C0C9BE0A04AEBC032300C504CFB +:10754000E060C1F8EA101A63E061A5DCEA11404C82 +:10755000E0654000EA15408FFC174034E0633A8C48 +:10756000EA130000402CE0A059B330080E99E0A0C7 +:10757000592630080A99E0A0006471001302F1EC6A +:1075800056040086000080010087000100000ED92B +:10759000010D02F1EC56030000000100595F009854 +:1075A0000299E0A0591EBB1BE6FC0168E0A059A2AD +:1075B000BB08E0A05801E0A04A67E74C0168C4BCE2 +:1075C000E74C0168403CE0A0599530080E99E0A0D6 +:1075D000590830080A99E0A0594100980299E0A0A2 +:1075E0005900BB1BE6FC016CE0A05984BB08E0A07D +:1075F00057E3E0A04A49E74C016CC2DCE74C016C60 +:10760000404CE0A0597730080E99E0A058EA3008C5 +:107610000A99E0A0592300980299E0A058E2149634 +:107620001697E6FC0170E0A059650C980E99E0A051 +:1076300057C3E0A04A29E74C0170C0DCE74C017059 +:107640002FBDE3CF80FBD703800139BC80013942D5 +:1076500080013718EBCD40801897301BEA1B43346C +:10766000E0A04A5CC083FC1CC3B40E9BE0A0487E33 +:107670001897C0D8FC1BC3340E9CE0A04A5BC072B4 +:10768000FC1C43B40E9BE0A0487118970E9CE3CD00 +:1076900080800000EBCD40FC1692300700D6D2006F +:1076A0001302F1EC560400870000800100880001FD +:1076B00000009932010D02F1EC56030000000100B8 +:1076C000300459FCC03331E6C0385C5C1896300594 +:1076D000C1985812C1B1EA0C1118E0633A8CEA1350 +:1076E00000005C5CE60C002367EC0E9BE0A04850B9 +:1076F0001897E6FC00F0089BE0A0484A18942FF584 +:107700005C550C35C0645802CE51EA0C111DCE6B8D +:107710005C560C9CE0A04A5C1896E0633A8CEA1335 +:1077200000000E9C0C9BE0A048FDE74C01D4089C97 +:107730000C9BE0A048F7E74C01D8E3CF80FC0000A9 +:10774000E06C3A8CEA1C0000300BF94B01DCF94B81 +:1077500001E0F94B01E45EFDD431202D300B500BDC +:107760003000300159FCC04331DC501CC058FE3C95 +:10777000FF015C5C501C3007C148400C680BE0A066 +:107780004807500C0A066DEC009BE0A048011890D9 +:10779000ECFC00F0029BE0A047FB18912FF75C7710 +:1077A000E0663A8CEA160000401C1837C2C4ED357A +:1077B00001AC59E5C0640E15FE35FF015C55C048AB +:1077C00000CF43001302F1EC560400880000800152 +:1077D000008900010000D989010D02F1EC56030077 +:1077E00000000100EE05111D5C55A3650C940A0410 +:1077F0006803EC05000C204C7802069C049BE0A07A +:10780000476BE06B999AEA1B3E99E0A049ABCC83A9 +:10781000301B069CE0A049A6CC33300B049CE0A0B2 +:1078200049ADCBE258B7CBC55C770E9CE0A049E2EE +:107830001897400C0E9BE0A04887ED4C01DC009CA3 +:107840000E9BE0A04881ED4C01E0029C0E9BE0A065 +:10785000487BED4C01E42FEDD83AD70380011D0C95 +:10786000D431208DE06C37BDEA1C3586506C505CFD +:10787000504C300C503C502C3000E0673A8CEA17EA +:107880000000EF3C01AC59ECC034501CC03831EC66 +:10789000501CEEFC01B8401B183BC092401CF80B7A +:1078A000161F160CA15C5C5C507CC048A19C5C5C03 +:1078B000507C300CBA8CC158EE1C80000A9BE0A0B2 +:1078C0004951C0C3009C0C9BE0A047741890404BEA +:1078D000FC1C3F80E0A0476E504C1B8B2FFBBA8BEB +:1078E0001B8C407B00AF9D001302F1EC5604008915 +:1078F00000008001008A000100004C42010D02F1ED +:10790000EC56030000000100163CE08400A4401C7B +:107910001B861826FE36FF015C56ECC1FF015C5148 +:10792000A361EE01000B7604A366EE0600056A0C67 +:10793000760BE0A046E3301BE0A04926C0736A0C3A +:10794000089BE0A046DB1894C0686A0B089CE0A086 +:1079500046D518940E0163E30E066DEC63EBE0A0D0 +:1079600046CD301BE0A04910C0736DEC069BE0A033 +:1079700046C51893C0686DEB069CE0A046BF1893FF +:10798000E2F200F0ECFC00F0E2FB00F0E0A046B612 +:10799000301BE0A048F9C083ECFC00F0049BE0A0A1 +:1079A00046AD1892C078ECFB00F0049CE0A046A61F +:1079B00018923011EA1140A0089C029BE0A048E414 +:1079C000C0B3069C029BE0A048DFC063049C029BFE +:1079D000E0A048DAC3F26A04301B089CE0A048D457 +:1079E000089CC032EE1C8000E065CCCDEA153D4C11 +:1079F0000A9BE0A048C9C0C3403C089BE0A046ECFD +:107A0000503C406BFC1C3F80009BCC001302F1EC0F +:107A10005604008A00008001008B00010000F3F989 +:107A2000010D02F1EC56030000000100E0A046E663 +:107A3000506C6DE4301B089CE0A048B8089CC03234 +:107A4000EE1C80000A9BE0A048B1C0C3402C089BFC +:107A5000E0A046D4502C405BFC1C3F80E0A046CE0A +:107A6000505CECF600F0301B0C9CE0A0489F0C9C96 +:107A7000FE93FF48C48B403C406BE0A04789EF4C2D +:107A800001C8402C405BE0A04783EF4C01CC404B49 +:107A9000009CE0A0477DEF4C01D02F8DD83A00002C +:107AA000EBCD40F830073006C2E8EC0C111D5C5CF1 +:107AB000A36CE06A3A8CEA1A0000F40C0009F2FBAD +:107AC00000F073E3F40C0305169CE0A046ED189457 +:107AD000069C069BE0A046E818930A9C0A9BE0A03F +:107AE00046E3069BE0A0468A089BE0A04687E0A00C +:107AF0005749E0A088C7E0A0480F0E9BE0A0467E53 +:107B000018972FF65C565866CD15FC1B40C00E9C8E +:107B1000E0A0473EE3CD80F8EBCD40FC30073006D7 +:107B20003004C388E80C111D5C5CA36C0081DC0090 +:107B30001302F1EC5604008B00008001008C000160 +:107B40000000E7D1010D02F1EC5603000000010036 +:107B5000E06A3A8CEA1A0000F40C0009F2FB00F02B +:107B600073E3F40C0305169CE0A046B01892069C43 +:107B7000069BE0A046AB18930A9C0A9BE0A046A691 +:107B8000069BE0A0464D049BE0A0464AE0A0570CAF +:107B9000E0A0888AE0A047D218950E9C0A9BE0A03E +:107BA000463F18970A9C0A9BE0A046900C9BE0A0D9 +:107BB000463718962FF45C545864CC75FC1B40C0B3 +:107BC0000E9CE0A046F7189BE0A046801897FC1B8F +:107BD00040C00C9CE0A046EE0E9BE0A045B3E3CD78 +:107BE00080FCD70380013A5480019D5480011BE83A +:107BF000800118CC80011A60800117F0EBCD40E0C5 +:107C00003016582CC1613017EA173F00E0653A8CF6 +:107C1000EA150000EAFC01D40E9BE0A047D9C1D3CD +:107C2000EAFC01D80E9BE0A047D3C1733006C158CF +:107C3000581CC131FC17BF00E0653A8CEA15000002 +:107C4000EAFC01D40E9BE0A047CFC072EAFC01D849 +:107C5000006361001302F1EC5604008C0000800107 +:107C6000008D000100008D69010D02F1EC5603004A +:107C7000000001000E9BE0A047C9CEB30C9CE3CDF1 +:107C800080E0D70380011C7CA36BE06A3A8CEA1A7F +:107C90000000F40B03099909140B77EA991AF6FB13 +:107CA00000F0992B5EFD0000A369E0683A8CEA18A9 +:107CB0000000F009090C1009F34B0078F34A00F0BA +:107CC0005EFD0000E06A3A8CEA1A0000140BF76CC3 +:107CD000018C5EFDEBCD40801897300BE0A04796FD +:107CE000C072FC1CBF800E9BE0A0460218970E9C41 +:107CF000E3CD808080011C9480011978D43121FD6E +:107D000014961297502C503B300550C5371032B1A5 +:107D100032D232540D8CF80B1518C04140CC2E1DB8 +:107D2000D832083CC091506550755085509550A58B +:107D300050B5300CC0A82FF6189B1A9CE0A0061E68 +:107D4000CEA73FFCCEDBA1AC189BA3AB0D9A2FF6C0 +:107D5000F4C90020CF902039C0D02089C0602029EC +:107D6000C0702039C0C1C088A1BC5C7CCEEB169C21 +:107D7000CECBA3BC00A5FA001302F1EC5604008D93 +:107D800000008001008E0001000018A2010D02F128 +:107D9000EC56030000000100CFBBA5AC5C7CCE7BA1 +:107DA000E04A002AC0E16E0A740A50EA6E092FC93F +:107DB0008F09580AC0475C3A50EA169C2FF6C15802 +:107DC00050E5C0E840EAE069FFFFEA197FFF123A98 +:107DD000C06030A9F409034B230B50EB2FF60D8B39 +:107DE0003D0A160A58AACEF30D8BE04B002EC04078 +:107DF0003FFB50DBC2280D9B2FF6E04B002AC091C1 +:107E00006E0B760B50DB6E0B2FCB8F0B2FF6C15802 +:107E100050D5C0E840DAE069FFFFEA197FFF123A67 +:107E2000C06030A9F409034B230B50DB2FF60D8BF8 +:107E30003D0A160A58AACEF3FB5C003C0D8BE06CA1 +:107E4000D114EA1C8001E0A09573C0200D3CFB6CAE +:107E5000003E5C5CE04C0068C0910D8BE04B00681C +:107E6000C051362CFB6C003EC0A8E04C006CC081B9 +:107E70000D8CE04C006CC041FB60003E2FF6FACC4C +:107E8000FFC0505C0D3B320CF6CA0025C2D021CA9F +:107E9000E080008F204AE08300E093001302F1ECC1 +:107EA0005604008E00008001008F00010000A71919 +:107EB000010D02F1EC56030000000100016D203AB3 +:107EC000E0830089210AE08000B5209AE0800083E9 +:107ED000202AE0800156201AE08000F0E088015C52 +:107EE000204AC783201AE08000E9205AC3E0201A04 +:107EF000E08000A0201AC270203AC0E0202AE08072 +:107F00000099203AE0800096C469FACCFFC0406B2B +:107F1000F80B0B04C4F96E0C780C504C6E0B2FCB85 +:107F20008F0B40DA580AC057E0A0951C189BC098E8 +:107F3000300BE0A094DDC040404B182BC02840DB44 +:107F4000507BC3B96E0C780A300BBB1B6E0C2FCC68 +:107F50008F0CBB0AE61B0000BB1BFACCFFC0504CC9 +:107F6000378B240CC90DC299FB3C003E262CC280E5 +:107F7000206CC120202CC1D0202CC060205CC1907E +:107F8000209CC0F0C22840CC6E0B760B970C6E0C78 +:107F90002FCC8F0CC12940CC6E0B760BB60CCF8B3F +:107FA00040CC6E0B760B970C6E0C2FCC8F0CC059FF +:107FB00040CAF40B141F6E0C780CB91B0006C900E4 +:107FC0001302F1EC5604008F0000800100900001C4 +:107FD0000000B771010D02F1EC5603000000010032 +:107FE000CE9B40CC6E0B760BB68CCF1B40CC6E0B71 +:107FF000760B970CCDFBFB3A003EE04A004C6E0A34 +:10800000B5082F8A8F0ABB19F20A1501C072FACC83 +:10801000FFC0406AF80A0B02C138FB1A003CEDBAF7 +:108020000001C072FACCFFC0406AF80A0B01C08898 +:10803000A19AC092FACAFFC04069F4090B0C406AC9 +:108040002FFA506AFACAFFC0406C180A504A1A9CAC +:10805000CD8DCC58FB3C003EE04C006CC0516E0A0C +:1080600015083009C0D8003CC080E04C006AC05000 +:108070006E0A15083009C0486E0AB5082F8A8F0AA3 +:10808000BB19E04C0068C0315C78C0C8E04C0062AD +:10809000C0315C58C078E04C0074C040E04C007ABD +:1080A000C0313009BB19FB1C003CA58CC742BB0882 +:1080B00058085C29C700169CA5BCE04C0078C6B1E6 +:1080C000330CFACAFFC04069F4090B0C406A2FFA5E +:1080D000506AFACCFFC0F80A0B0BC5A8FB3A003E69 +:1080E00000F214001302F1EC56040090000080012D +:1080F000009100010000A3CC010D02F1EC56030039 +:1081000000000100262AC0E0206AC130202AC250A7 +:10811000202AC270205AC210203AC190206AC100A1 +:10812000C2686E09F2CAFFFC8F0A72085C68C24816 +:108130006E09F2CAFFFC8F0A72085C88C1D86E090A +:10814000F2CAFFFC8F0A72083009C1886E09F2CAB0 +:10815000FFFC8F0A7208C1086E0AB5098F0AC0E8D1 +:108160006E09F2CAFFFC8F0A7208C0686E09F2CA73 +:10817000FFFC8F0A7208F009141FBB1958085C290C +:10818000C074FACCFFC0406AF80A0B02C138FB1A6F +:10819000003CEDBA0001C072FACCFFC0406AF80A98 +:1081A0000B01C088A19AC092FACAFFC04069F409C5 +:1081B0000B0C406A2FFA506AFACAFFC0406C180ACA +:1081C000504A1A9CCF4A6E0C780CFACBFFC0406A1A +:1081D000F60A0B0C6E0C2FCC8F0CC108FACCFFC02A +:1081E000406AF80A0B04406A2FFA506AF60C151818 +:1081F000C080FACCFFC0F80A0B0B406B2FFB506B12 +:1082000040EB406C007DAA001302F1EC5604009193 +:10821000000080010092000100003607010D02F10C +:10822000EC56030000000100181B409C181B407C0A +:10823000181B40AC181B408C181B40B31623FB1CAA +:10824000003CA39CC073320A069B1A9CC40CFE908F +:10825000FDD4406AFACBFFC01A9CE0A003F7FE9160 +:10826000FDCC330A409B1A9CC32CFE90FDC6407A7D +:10827000404B1A9CE0A003EAFE91FDBF330A40ABDD +:108280001A9CC25CFE90FDB9408A404B407C180BA2 +:108290001A9CE0A003DBFE91FDB0330A40BB1A9CA0 +:1082A000C16CFE90FDAAFB1C003CA39CFE92FD8EBF +:1082B000320A069B1A9CC0BCFE91FD88FE9FFD9D64 +:1082C0008001B9948001B9A48001B930D4A1189774 +:1082D00016963005C0282FF50C35C094301AFACB0D +:1082E000FFF90E9CE0A003B2CF70D8AADAAA000072 +:1082F000D431189016957853E04B006FC03130821E +:10830000C088169CA5BCE04C007830A2F9B20010E1 +:1083100033C4A10A14961697E0450064C040E045B6 +:108320000069C071580A5C2B00AFAD001302F1EC7C +:10833000560400920000800100930001000089BCF7 +:10834000010D02F1EC56030000000100C0445C374F +:108350005C365C1758065C27C0F160DC580CC0C165 +:108360005882C3B1E11C003CA58CC37233B4330CFA +:10837000E76C003BC328E8C1000120140C9A0E9B57 +:108380000498E409141FE0A091692D085C58E048A6 +:10839000003AC045EACCFF5118080601A2880C9AA1 +:1083A0000E9B0498E409141FE0A0915814961697A8 +:1083B000580A5C2BC040604C023CCDE35882C0D1CF +:1083C000E11C003CA58CC092038CE04C0030C050F6 +:1083D0002014330CE6040B0CE80B113C817B0803E2 +:1083E000814360DC183BC094182B819BE11C003C4E +:1083F000A5CCE15C003CD83A580CC117E11C003C0C +:10840000E21C0014590CC0B160EA606C181A609C40 +:10841000181AF40B01045814C0258194D83AD703D4 +:108420008001B60C8001B60CD431149616971893BF +:1084300030043005EA154024C158EDB30000C09265 +:108440000C9A0E9B08980A99E0A052A3008157004D +:108450001302F1EC56040093000080010094000127 +:1084600000009D94010D02F1EC5603000000010094 +:1084700014961697A153089A0A9B08980A99E0A0A7 +:10848000529A149416955803CEB10C9A0E9BD8327A +:10849000D43120DD18921693FAC6FFF4B90AFAEB2C +:1084A00000040695A5B536170E35C0C078DC580C0B +:1084B000C037306CC068C061E0450067C031301C17 +:1084C00085DC049B1A9CE0A08D5D189A39F9060999 +:1084D000E06BCED4EA1B80013038582CC0E185789F +:1084E00059A9F7BB02FC644A1498303C173910C9EB +:1084F000201CE080016ECFBB581CC105857859A9AE +:10850000F7BB03F8F7BB02F4644A1498303C173900 +:1085100010C9201CE080015DCFBB33040E35C111B2 +:10852000644CB884644C2FFC854CF8CBFFFF854B22 +:108530000E33378BF9BB0158B88B646C2FEC856C0C +:10854000580AC0513007300CBA0CC3B9FAC0FFF357 +:10855000300830090E35E081009164D75807F7B72D +:1085600007FFF9B706215C87EEC1FFFFA504FAEA11 +:1085700000E407001302F1EC5604009400008001AF +:10858000009500010000F72C010D02F1EC560300EC +:10859000000001000004E0A052C9C032EE158000C6 +:1085A000FAE500049A0B204BBA0B300CFB6C000C64 +:1085B0002FF6C0282F965811C2F5FAEA0004301899 +:1085C0003009E0A052B1C28331CBFACCFFFCE0A06D +:1085D0008281FAEA0004E0A052D418952071581163 +:1085E000C0B5E0A052E814981699FAEA0004E0A099 +:1085F00050ABFAEB00042F96307CC058F7D5C0047E +:108600000CFBA5455815C035201CCF97201CCD3636 +:10861000300B0CFBCFCB0C20FAC6FFF30E30E0077B +:1086200017505C87C3460037C094FACCFFF40E0C99 +:10863000199C588CC03530FCC028300C0E9BC028CB +:108640002017201BFACAFFF4160A1599F80918001A +:10865000CF8058FCC041F2CCFFFFB49C580BC067E0 +:1086600020162FF79A0B2FCBBA0B5C870E9CC0D825 +:10867000EC0C070A2D0A5C5AE04A003AC045E6C9EC +:10868000FF3A120AEC0C0B0A201CCF3764DC580CA2 +:10869000E08700AA008EE4001302F1EC5604009576 +:1086A0000000800100960001000062E7010D02F168 +:1086B000EC56030000000100EECC000185DCCA5836 +:1086C000FAEA0004BFDBFAEB00049A0BE06C759742 +:1086D000B93BE07C86A0F60C0C0ABA0AF9DAB010B5 +:1086E000F80C1107E06993DCEA198000581CC055AA +:1086F000FAEA00045D19C0D85C3C300A300BEA1B72 +:108700003FF05D1914981699FAEA0004E0A051B4FC +:10871000FAEB000436610235C0419A062F66C02884 +:10872000306664DC18065946F9B60413330CFB6C4A +:10873000000CFAC7FFF35816C2B5FAEA0004E0A02D +:10874000522E18992F87308C30ABF20B0D0A1499EA +:10875000F6C8FFD00EF8201CCF812F872086581630 +:10876000CEB5FAEA0004E0A0521AE0A052431498F1 +:108770001699FAEA0004E0A04FF93008E069D784BE +:10878000EA194197E0A0513BFAEB0004CD7B0E20A3 +:10879000FAC6FFF3C06820109A0B201BBA0B2FF605 +:1087A0000D8C083CCF900235C0419A072FF7C04886 +:1087B000E04500655F0764DC00D9AA001302F1EC14 +:1087C0005604009600008001009700010000DD5C67 +:1087D000010D02F1EC5603000000010018075C8750 +:1087E0000E30E00717505C87C2260037C084EC07C4 +:1087F000070CE04C0035C035339CC028330C0E9B71 +:10880000C0282017201BEC0B0709F8091800CFA07F +:10881000E04C0039C051F2CCFFFFEC0B0B0C580BB5 +:10882000C06720162FF79A0B2FFBBA0B9A08F3D7C5 +:10883000B0100C9A069B049CC1AC2F3DD83AD703CC +:108840008001AF1080013A9480013A9080019A3CF7 +:1088500080013AEA80013B1E800139BC80013AE286 +:1088600080013B38800136B080013942D431203D4F +:10887000189316971496109C66D85819C06430192E +:10888000E066423AEA168000A5BB330232EE366A51 +:10889000143BC0B03674083BE08100995BCCE085A6 +:1088A000009B103CE08400982FFC143BC0C0E71BE9 +:1088B000003CA58BC0431039F20817505C8C181887 +:1088C000F9B80600664A667714075C8C581CC2E447 +:1088D000AE82667B2FFB877B5818C0540058780007 +:1088E0001302F1EC5604009700008001009800018B +:1088F00000004AB7010D02F1EC5603000000010030 +:10890000E71B003CA58BC072667BF40B0B0E667BED +:108910002FFB877BF80B11001638C034109C5C3C91 +:108920005C8CF80B110087AB18081238F00917504F +:108930005C898789129B667C180A149E5809C0506E +:108940000D3C201B1CCCCFD1102987B9CC38F8099D +:108950001900C1D4129B0E945809C0500D3A201B27 +:1089600008CACFD1667B120B877B182987A95818B4 +:10897000C054E71C003CA58CC082664C667BF80B9B +:108980000B0E668C2FFC878C87B8CA48189A0C9BF4 +:108990000E92580CC0501734201A04C4CFD1667BF5 +:1089A000180B877B18195818C054E71B003CA58B7F +:1089B000C082664B667AF60A0B0E667B2FFB877BBE +:1089C0005C891238F00917505C891806664B667C82 +:1089D000180B129C169E5809C0500D3A201C1CCA38 +:1089E000CFD1667C120C877C102987A9C738E04755 +:1089F0000061C1213707C1481039C064E71B003C42 +:108A0000009A29001302F1EC56040098000080013E +:108A10000099000100000A0C010D02F1EC56030060 +:108A200000000100A58BF20817202018F9B80600F5 +:108A300008373657F9B70145C058E0470041F9B744 +:108A40000050664A0D3B6674F4040B0B667B2FFBEB +:108A5000877B5818C054E71B003CA58BC1D2667BAE +:108A6000F40B0B0E667B2FFB877B5818C155201922 +:108A70005C891238F00917505C89160A129B14940D +:108A80005809C0500D3E201B08CECFD1667B120B7B +:108A9000877B102987A9664B667616060CC7580C8B +:108AA000C04632BB0CCBC04832DB0CCB5C3C300444 +:108AB000C08830ABE0A08FEEFA040B0A169C2FF4AE +:108AC0005C8C581CCF745824C064A5B7E04700657F +:108AD000C0210CC25804C0910CC2C09820141A9C2A +:108AE000F804070C2D0C0CCC5814CF94664B667C04 +:108AF000180B16168786E71C003CE21C0014590C64 +:108B0000C0F1666B667C180B66AC180B668C180B94 +:108B100066BC160C66EB163CC034162C879C2FDD09 +:108B2000D83AD7030096D4001302F1EC560400990A +:108B300000008001009A000100009FC7010D02F1B2 +:108B4000EC560300000001008001B96CD421189795 +:108B5000783C6E2A5D1A8F3CC0506ECC2FFC8FCCB7 +:108B6000D82A3FFCD8220000D421189616951497D5 +:108B7000300CC02820175807C0500B3B0C9CCE7FF0 +:108B8000CFA7D822EBCD4080E06742ACEA170000C7 +:108B9000FEB0E9B48F0CE0A08FFB8F1CE3CF808088 +:108BA0008001BA44EBCD40E021FD18971495360CB6 +:108BB000E0A08134322CE0A08131321CE0A0812E73 +:108BC000E0660008EA168080301937CA300B0C9C2A +:108BD000E0A057A6A36550053019304A1A9B0C9C9B +:108BE000E0A05890300CC0780F0BFACAFFFCF40CD0 +:108BF000092B2FFC59ECC044E0477FFCCF613019B2 +:108C0000378AFACBFFFC2FC60C9CE0A0587B321CA5 +:108C1000E0A08126322CE0A08123360CE0A0812048 +:108C2000C008D703800149D480014BB8D421FEB0DD +:108C3000ECF9E0A0218FE0A084EF1897E06642AC49 +:108C4000EA1600006C1CF915003C5C001302F1EC04 +:108C50005604009A00008001009B00010000207C67 +:108C6000010D02F1EC56030000000100006A294CDE +:108C7000F92400005807C080300CE0A08F83F9D59C +:108C8000C010FEB0E9E7301B6C0CFEB0ED7F6C0C41 +:108C9000300BF96B0054301BFEB0ED346C0CF93B1B +:108CA0000047580BC050301BFEB0EEDEC2782C7C63 +:108CB000198C581CC131E06CD06CEA1C8001FEB0EC +:108CC000EA4B300CFEB0ECF86C0B6C1CFEB0EF28DD +:108CD000300B6C0CFEB0ED78C1186C1C292C988CF4 +:108CE0005C8CE0A08899E0A00F79303A6C0B6C1C8A +:108CF000FEB0F0306C0CFEB0EECF5807C0606C1CBC +:108D0000F955006E290CB884FEB0EC92D82AD7032E +:108D1000800074D88000DE088001A4CC8001BA14E1 +:108D200080006EE480007594800078F880007548BB +:108D3000800079B08001ACA88000BA6C800074C05B +:108D4000EBCD4080E06742ACEA170000301B6E0CB0 +:108D5000FEB0ECEC6E0CFEB0ED5FC070304CE0A0ED +:108D60003221304CE0A01AE66E1CF91B00A9B100BC +:108D70001302F1EC5604009B00008001009C0001EE +:108D800000003454010D02F1EC5603000000010014 +:108D9000006E580BC081300A6E0BFEB0EFED6E0C0A +:108DA000FEB0EE8C346CE0A0805D301BFE7C2400B5 +:108DB000E0A07D40346CE0A08077E3CF8080D703D3 +:108DC000800075BC800076A8800100348000D1C48A +:108DD00080007BE480007928EBCD40C0201DE06757 +:108DE00042ACEA1700006E0C301BF96B00593006DC +:108DF000300BBA0B301BFEB0EB8F6E0CFEB0EC8C60 +:108E0000583CC1409A8B2FFBBA0B301B6E0CFEB046 +:108E1000F0231896C0B19A8CE04C9C40CEF5E06CE3 +:108E2000CEB4EA1C8001FEB0E9A95806C0519A8C64 +:108E3000E04C9C40C225E06C0550EA1C0000300B61 +:108E4000F95B002EF95B0030F95B0034F95B00360A +:108E5000F96B002B78FAB48B78FAB49B300AB91B03 +:108E6000F8EB0008F8EB0010F8EB0018F8EB002026 +:108E70002D8CB80BB8ABC058300C6E0B2AABB68C2F +:108E8000300B6E0CFEB0EC44300B6E0CFEB0EB44BD +:108E9000008422001302F1EC5604009C00008001C3 +:108EA000009D000100005EEC010D02F1EC56030094 +:108EB000000001006E0CFEB0EC85581CC0D1E06CC7 +:108EC000CEB4EA1C80012F8CFEB0E96A303B6E0CF8 +:108ED000FEB0EC9EC058301B6E0CFEB0EC99346CAA +:108EE000E0A07FD2302BFE7C2400E0A07CB5346C67 +:108EF000E0A07FEC300C6E0B2A7BB68C2FFDE3CF0D +:108F000080C0D7038000758480007CC48000757C9D +:108F1000800073848000760C80006FE880007658B3 +:108F2000D401FEB0E821301BFEB0EC3A346CE0A076 +:108F30007FAB305BFE7C2400E0A07C8E346CE0A034 +:108F40007FC5D80A80006DB0800075E880019CD094 +:108F5000800196A080019D14EBCD4080F80B151880 +:108F6000C030582CC2C1E0670550EA170000EF3C42 +:108F7000002D582CC0D1301BE06C42ACEA1C000024 +:108F8000780CFEB0EBEFE06C00FFEF6C002D300CC6 +:108F9000EF5C002EEF5C0030EF5C0032EF6C002BDA +:108FA000300A300BAF1BEEEB0008EEEB0010EEEBDF +:108FB0000018EEEB001A05001302F1EC5604009DB8 +:108FC00000008001009E00010000CB27010D02F18E +:108FD000EC5603000000010000202D87AE0CAEAC63 +:108FE000E3CF8080800075ACD421E0670550EA179C +:108FF0000000EF1B002E169A2FFAEF5A002EEE0BF0 +:109000000B0C0F8C2C2C5C5CE04C004EF9BC02016C +:10901000FE0C001C98CC180F009E060006000600EF +:109020000600060000E20600015A01BC0600060028 +:1090300005220600047602EC0326035A038E06007E +:1090400003D003D004020402043406000600060024 +:1090500006000600060006000600060006000600E0 +:1090600006000600060006000600060006000600D0 +:1090700006000600028C04A004BC050C02BC06001D +:10908000060004F6060006000600060006000600BC +:1090900006000600060006000600060006000600A0 +:1090A0000600060006000600060006000600060090 +:1090B00006000240EF1C002E582CE08102B70F9CE6 +:1090C000EF5C0032EF1C0032581CC065E06C008081 +:1090D000EF6C0028C048370C008032001302F1EC1E +:1090E0005604009E00008001009F00010000749C57 +:1090F000010D02F1EC56030000000100EF6C0028A6 +:10910000301BE06C42ACEA1C0000780C2CECB88BF5 +:10911000EF6B002B300C2D27AE0CD82AEF1C002E45 +:10912000582CE08102950F9CFEB0C94A189B305A1A +:109130003026C2308FFB19BBA96B19CC180BEF5B23 +:109140000034EF5A0036EF66002CE06442ACEA14BB +:109150000000680CFEB0EB50581CC171302B680C3D +:10916000FEB0EB506EFC19ACF9DCC004EF5C0038CB +:10917000300CEF5C003AC0980E9C2C0C8FFC300C2D +:10918000EF5C0034EF5A0036EF66002B300C2D27D1 +:10919000AE0CD82AE06442ACEA140000300B680C34 +:1091A000FEB0EAE4680CF92B0051581BC041302B8B +:1091B000F96B0051303BEF6B002B3005EF55002E63 +:1091C000FEB0EB1A582CE0810243EF1C003A2FFC52 +:1091D000EF5C003AEF1C0038EF1B003AF60C190068 +:1091E000E0810236303B680CFEB0EB0CEF550038E6 +:1091F0002C67AE05D82AEF1C002E582C00232B001C +:109200001302F1EC5604009F0000800100A0000151 +:109210000000EBF7010D02F1EC5603000000010025 +:10922000C265EF1C0032580CC0510F9CEF5C00323D +:10923000C088EF1C0032EF1B002E163CE081021AA2 +:10924000EF1C0032EF1B002EF80B1900E081021218 +:10925000EF1B0032FE3BFF025C5B0E9C2FECFEB06E +:10926000C8F1C091370CEF6C0028C098300C2CE787 +:10927000AE0CD82AE06C0080EF6C0028302CE06B3C +:1092800042ACEA1B0000760B2CEBB68C3005EF5598 +:109290000032EF55002E301C2D57AE8CD82A3005E9 +:1092A000E06C1981EA1C00DA8B0CFEB0BFF18FFC78 +:1092B000301BEF5B00363026EF66002BE06442ACDB +:1092C000EA140000680CF9660051303AF96A00327D +:1092D000EF55002E2D37AE8B300BFEB0EA59300A19 +:1092E000305B306CE0A0632ED82AFEB0BFDD8FFC6F +:1092F000303BEF5B00363026EF66002BE06442AC7B +:10930000EA140000680CF9660051F96B0032300B6A +:109310002D27AE0BFEB0EA3CD82AFEB0C0678FFC0A +:10932000003462001302F1EC560400A0000080013A +:1093300000A1000100005746010D02F1EC560300A8 +:10934000000001003026EF560036EF66002BE06487 +:1093500042ACEA140000680CF9660051303BF96B2E +:109360000032300B2D27AE0BFEB0EA24D82AE06C79 +:109370000080EF6C0028301CEF6C002BE06442ACE6 +:10938000EA140000680C302BF96B0032301BFEB081 +:10939000EA53300B680CFEB0E94B300CE0A08C6A4D +:1093A000300C2D27AE0CD82AE06C0080EF6C002822 +:1093B000301CEF6C002BE06442ACEA140000680C37 +:1093C000302BF96B0032301BFEB0EA36301B680CD4 +:1093D000FEB0E92E300C2D27AE0CD82AE06C0080B0 +:1093E000EF6C0028301CEF6C002BE06442ACEA14F8 +:1093F0000000680C302BF96B003230052D5CB8850D +:10940000300A305B306CE0A062AF2D27AE05D82A61 +:10941000E06C0080EF6C0028301BEF6B002BE064E9 +:1094200042ACEA140000680C302AF96A0032F96B89 +:10943000002B2D4C198C580CC091300A305B306CCD +:10944000E0A062E4000335001302F1EC560400A131 +:109450000000800100A200010000C28D010D02F198 +:10946000EC56030000000100301CE0A08C15300C0D +:109470002D27AE0CD82AE06C0080EF6C0028301C41 +:10948000EF6C002BE06442ACEA140000680C302B57 +:10949000F96B00320F8BE04B00D65F0B2D4CB88B75 +:1094A000300C2D27AE0CD82AE06C0080EF6C002821 +:1094B000301CEF6C002BE06442ACEA140000680C36 +:1094C000302BF96B00320F8BE04B00D95F0B2D3C3A +:1094D000B88B300C2D27AE0CD82AE06C0080EF6CD6 +:1094E0000028301CEF6C002B302CE06B42ACEA1BE8 +:1094F0000000760B2CEBB68CE06C3828EA1C0000E0 +:10950000786CF90B0028581BCB35300B2D8CB80B21 +:10951000300A304B306CE0A0628BCAABE06C00804C +:10952000EF6C0028301CEF6C002BE06442ACEA14B6 +:109530000000680C302BF96B0032FEB0EC63300C8D +:109540002D27AE0CD82AEF1C002E585CE08100B607 +:109550000E9C2FFCFEB0BEDAC0F1370CEF6C002879 +:10956000C0F8EF1C002E583C00D93C001302F1EC6F +:10957000560400A20000800100A3000100007D3617 +:10958000010D02F1EC56030000000100E08100A88B +:109590000E9C2FFCFEB0BEE4CF30E06C0080EF6C80 +:1095A0000028302CE06B42ACEA1B0000760B2CEB61 +:1095B000B68C301CEF6C002B300C2D27AE0CD82A4B +:1095C000EF1C002E582CE081008B0E9C2FFCFEB06F +:1095D000BEF5CE41CD5BEF1C002E582CE081008003 +:1095E0000E9C2FFCFEB0BF0CCD91CCABFEB0BFD813 +:1095F000C2F0E02C00C4C0A0204CC040207CC14080 +:10960000C1C8FEB0C70B8FFCC1F8FEB0BFD58FFC40 +:10961000198B580BC041E06B00C4B88B6EFC199CD1 +:10962000EF5C0034C118E06C00CF6EFBB68CFEB06E +:10963000BF9D6EFBB69CC088E06C00C46EFBB68C10 +:10964000300C6EFBB69C303CEF6C002CC0B8E06C6C +:1096500000CF6EFBB68C355C6EFBB69C303CEF6C7D +:10966000002C6EFC199B580BC0D1302CE06B42AC27 +:10967000EA1B0000760B2AFBB68C300CEF5C003442 +:10968000C0D8198CE04C00CFCF10301C00BADD00E0 +:109690001302F1EC560400A30000800100A40001B5 +:1096A0000000691E010D02F1EC56030000000100EC +:1096B000E06B42ACEA1B0000760B2AFBB68C30262E +:1096C000EF560036300CEF5C002E2D57AE86E0646E +:1096D00042ACEA140000301B680CFEB0E8F9300B15 +:1096E000680CFEB0E89D300CFEB0BF5AD82A370C8B +:1096F000EF6C0028301CEF6C002B300C2D27AE0CCB +:10970000D82AD703800031C0800075F88000760425 +:10971000800032208000206C80002084800021C8DE +:10972000800075F0800073E8800167208001BA2C0A +:10973000800167C480007B98800020A0800020D03A +:109740008000212C80002170800023108000318C4B +:1097500080002328800022DC8000761C800022EC20 +:10976000EBCD40C03006E0670550EA170000EF3C43 +:10977000002B581CC051311CEF6C002BC108EF3C72 +:10978000002B582CC051312CEF6C002BC088EF3CC3 +:10979000002B583CC041313CEF6C002BEF3C002BC0 +:1097A000211CC060201CC1C0201CC580C998EF3698 +:1097B0000099DB001302F1EC560400A400008001C4 +:1097C00000A50001000003A6010D02F1EC56030004 +:1097D000000001000028321CEF6C002BE06C42AC52 +:1097E000EA1C0000780CF93B0032582BE081009015 +:1097F000303B2CECB88B300C6EFBB68C6EFBB69C01 +:10980000C868EF1C0036581CC375EF1C0030EF1BF6 +:109810000036F60C1900C7B26EFCEF1B0030F80BD7 +:109820000706EF1C00302FFCEF5C0030EF1B00360A +:10983000F60C1900C6C1300CEF5C0030EF5C00364E +:10984000323CEF6C002BE06C42ACEA1C0000780C60 +:109850002AFCF92B0000582BC5A1301BE06C42AC50 +:10986000EA1C0000780CFEB0E7ED300C6EFBB68C05 +:109870006EFBB69CC4C8323C2D57AE8CC488EF1C1E +:109880000030EF1B0034F60C1900C412EF3C002C22 +:10989000582CC1216EFBEF1C0030180B17D6E06C62 +:1098A00042ACEA1C0000780CFEB0E7E8C0E1302CC6 +:1098B000EF6C002DC0A8EF3C002C583CC0616EFB43 +:1098C000EF1C0030180B17A6EF1C00302FFCEF5CCC +:1098D0000030EF1B00BDC9001302F1EC560400A5D7 +:1098E0000000800100A600010000966D010D02F14C +:1098F000EC560300000001000034F60C1900C19181 +:10990000300CEF5C0030EF5C0034323CEF6C002B2D +:10991000E06C42ACEA1C0000780C2AFCF92B000039 +:10992000582BC071CADB300CEF5C00302CC7AE0C7A +:109930000C9C5C5CE3CD80C08000756C800075A4DD +:10994000EBCD4080303A300B300CE0A056F7582C6D +:10995000C041302CE3CD8080E06CCF44EA1C800114 +:10996000FEB0E4C0300CE06724B4EA170000EF6CEE +:109970000071EF5C0072FB3A000EFB3B000DFB3CFC +:10998000000CE0A00D4F300A300B0E9930ACB32A1A +:10999000201CCFE1930AE3CF9080D70380006FE8CB +:1099A0008000C1285EFF0000EBCD40E020EDFACC46 +:1099B000FFF4E0A0573D303B303CE0A0576DC04184 +:1099C000FC1C447A50BCE06724B4EA1700006FDC4A +:1099D00029ECF92500005C75F9D5B008E0A060E835 +:1099E0001896E0A00CD1EF6C006CEF2C006C582C9A +:1099F000C0815825C061301B006CF3001302F1ECEC +:109A0000560400A60000800100A70001000029D62E +:109A1000010D02F1EC56030000000100303CE0A013 +:109A2000571FC098581CC0715815C051302B303C7E +:109A3000E0A05716FACCFFF4780A500A781A501AA8 +:109A4000782A502AF7D6C01040BCE0A00C412887E5 +:109A50006E0C0C0C8F0C2F2DE3CF90E08001553451 +:109A60008001559C800168B48000C08C8001554005 +:109A70008000BFB0EBCD4080202DE06724B4EA1712 +:109A80000000EF2C0054580CC4551A9CE0A088BE6E +:109A90000E9C2ACC1A9B3069172A18BA2029CFD1DC +:109AA000EF2C0055EF2B006EF60C1800C291EF2B37 +:109AB0000070EF2A006E160AEF6A006EEF2B006E40 +:109AC000E04B003DC065EF2B006E23CBEF6B006ECB +:109AD000300BEF4B007829B7EF2B00005BFBC05138 +:109AE000301C2FEDE3CD8080161CE0A049A8BFDB21 +:109AF000E0A0498B5C6C581CCF44300CCF3BEF2B63 +:109B0000005DF60C1800CFA0EEEA00542A47AF1B08 +:109B1000CF5B6FECE06B7740EA1B001B008D87008A +:109B20001302F1EC560400A70000800100A8000118 +:109B30000000BE3D010D02F1EC56030000000100E3 +:109B4000163CCEE5CE0B0000EBCD40FC3007C068E4 +:109B50002926ED2C00000A0CAC8CE06624B4EA1631 +:109B60000000ED24006E5C675807C1D5ED27005555 +:109B700008175C67ED2500705807CEB4F9D7B00818 +:109B8000E0A0496FBFDB149216930A9CE0A04969DC +:109B900004980699E0A04920CE1208252926AC8514 +:109BA0003007CDCBE044003DC0652926ED2C0000F8 +:109BB00023CCAC8CE3CF80FC80013B1EEBCD4080FE +:109BC000E06724B4EA170000301CEF6C006C300C26 +:109BD000EF6C006D3FFBEF6B005430FBEF6B006FE1 +:109BE000314BEF6B0070EF6C0071EF5C0072E0A026 +:109BF00088C5EF4C0074E06BA648EA1B8000F94B67 +:109C00000068E06BA6ACEA1B8000F94B006CE06BCF +:109C1000A6B0EA1B8000F94B0070E06BA8FCEA1BC1 +:109C20008000F94B0074E06BAD9CEA1B8000F94B9F +:109C30000078E3CF9080D7038001BA38D42122ADD9 +:109C4000005F60001302F1EC560400A800008001E0 +:109C500000A900010000FE86010D02F1EC56030090 +:109C60000000010018943006FACCFFACE0A00BCA4B +:109C7000E06724B4EA1700000E9C1A9B3549190AC4 +:109C800016AA2049CFD1300B301CCCDC1895423CB1 +:109C90006EEBE0A03761E0A048913008FC19402449 +:109CA000E0A04803E0A048D5FB1A009AEF1B00464D +:109CB000142B5C64C2715805C0515C7CC0315C5B84 +:109CC000C0E030165805C0B06FFC0A0CEF4C007CA9 +:109CD000301CE06B2534EA1B0000B68C300CEF4CD6 +:109CE00000783FFCEF6C0054EEEA0054EEEB005CB1 +:109CF000EEEA0054EEEB0064EF2C006FEF6C006EA8 +:109D0000C1D8C39DC140300CEF6C006DEEEA005429 +:109D1000EEEB005C1A9CE0A0879D0E9C2ACC1A9B5F +:109D20003069172A18BA2029CFD1C21FCC8EC06043 +:109D3000EEEA0054EEEB00643016EF3C0071581C64 +:109D4000C0C1EF1C0072580CC0313016C068300C16 +:109D5000EF6C0071EF5C00725C665816C041300C0D +:109D6000EF4C007800AC19001302F1EC560400A986 +:109D70000000800100AA000100006B4D010D02F1FE +:109D8000EC560300000001006FDCF93B0061580B4A +:109D9000C0B1300BEF4B00782A0C198C581CC02531 +:109DA000C24C300CC0280C9C2D6DD8228001B8EC20 +:109DB000EBCD4080300CE06B24B4EA1B0000F74C84 +:109DC0000078303A303BE0A055011897C0EC0E9C6B +:109DD000E3CD8080D401303A303B301CE0A054F613 +:109DE000D802D70380015440D401215D1A9CE0A021 +:109DF0000B1B1A9BE06A24B4EA1A0000149E30ACD4 +:109E0000B709BD28201CCFD176089D082EBDDA0ADF +:109E1000E06C2534EA1C0000198C5EFCE06C24B474 +:109E2000EA1C000079FC5EFC300CE06B24B4EA1BF9 +:109E30000000F74C007C5EFD300CE06B2534EA1B23 +:109E40000000B68C5EFD0000EBCD40C0215D189691 +:109E50003007581BC0F1E0A00BCF418B163CC0531C +:109E6000418718275C57C8A8280C418718275C57DA +:109E7000C8581A9CE0A00AD85C5658A6F9B6020049 +:109E80001E06ED36000AFE06005215001302F1EC24 +:109E9000560400AA0000800100AB00010000D4F6C7 +:109EA000010D02F1EC56030000000100001F7A07CB +:109EB0001927350743515F6D400C418B163CC05349 +:109EC000400C41871827C6C8400BE06C9680EA1CFE +:109ED0000098180B418716272FF7C628401B41977B +:109EE0000E3BC0331627C5C8E06C9680EA1C00986C +:109EF000180B16272FF7C548402B41A70E3BC03340 +:109F00001627C4E8E06C9680EA1C0098180B162708 +:109F10002FF7C468403B41B70E3BC0331627C40837 +:109F2000E06C9680EA1C0098180B16272FF7C38860 +:109F3000404B41C70E3BC0331627C328E06C9680C8 +:109F4000EA1C0098180B16272FF7C2A8405B41D7D0 +:109F50000E3BC0331627C248E06C9680EA1C00987E +:109F6000180B16272FF7C1C8406B41E70E3BC033D3 +:109F70001627C168E06C9680EA1C0098180B16271B +:109F80002FF7C0E8407B41F70E3BC0331627C0884F +:109F9000E06C9680EA1C0098180B16272FF70E9C91 +:109FA0002EBDE3CD80C0D7038000C26C00B31F007C +:109FB0001302F1EC560400AB0000800100AC00017C +:109FC0000000C0DE010D02F1EC56030000000100AC +:109FD000301CE06B24B4EA1B0000293BB68C5EFD0C +:109FE000E06C24B4EA1C0000293C198C5EFC0000E3 +:109FF000D401E0A00A4DD80A8000C0BCE06B24B4B4 +:10A00000EA1B0000F75C0072301C28FBB68C5EFD7A +:10A010005EFD0000EBCD40C0215D1A9CE0A00A2847 +:10A02000408642070C9C0E9BE0A03812C0630C9C3B +:10A030000E9BE0A035C7C0B8E06C2400EA1C497450 +:10A040000E9BE0A035BF0C9BE0A0362AE0A046ECBA +:10A05000E068147BEA1847AEE0697AE1EA193F74D8 +:10A06000E0A04544E0A037AAE0A046DE3008FC1995 +:10A070004059E0A04650E0A04722E0A03847E0A0C9 +:10A0800046D3E068147BEA1847AEE0697AE1EA1942 +:10A090003F84E0A04640E068432DEA18EB1CE069ED +:10A0A00036E2EA193F1AE0A04521E0A037872EBD2D +:10A0B000E3CD80C0EBCD40C0215D1A9CE0A009D863 +:10A0C00040D642570C9C0E9BE0A037C2C0630C9C4C +:10A0D00000B7A0001302F1EC560400AC00008001B0 +:10A0E00000AD00010000AA66010D02F1EC5603006C +:10A0F000000001000E9BE0A03577C0B8E06C2400A2 +:10A10000EA1C49740E9BE0A0356F0C9BE0A035DA89 +:10A11000E0A0469CE068147BEA1847AEE0697AE16B +:10A12000EA193F74E0A044F4E0A0375AE0A0468E5C +:10A130003008FC194059E0A04600E0A046D2E0A05B +:10A1400037F7E0A04683E068147BEA1847AEE06981 +:10A150007AE1EA193F84E0A045F0E068432DEA186F +:10A16000EB1CE06936E2EA193F1AE0A044D1E0A016 +:10A1700037372EBDE3CD80C080011C7C800117F0F5 +:10A18000800118CC80011D388001371880011BE840 +:10A19000EBCD40FE22AD18971696FACCFFACE0A0AE +:10A1A0000979301B0D8CF80C1068EE0C0B0BE0617C +:10A1B00024B4EA110000E33A0071303C581AC1514E +:10A1C0000D89F20910680E09B29C0D89F209106818 +:10A1D0000E09B2CB581AC0E1E31B0072580BC0A1A4 +:10A1E000300BE36B0071C0680D8AF40A10680E0A28 +:10A1F000B49B0D8B008828001302F1EC560400ADCF +:10A200000000800100AE000100003FAD010D02F131 +:10A21000EC56030000000100F60B10680E0BB6AC04 +:10A22000FC134059029C1A9B3549190A16AA204969 +:10A23000CFD1300B301CC51E58ACE08200EA300C88 +:10A240000D8BF60B10680E0BB6DC0D8CF80C10683D +:10A250000E0C19D5029C1A9B3549190A16AA2049D9 +:10A26000CFD1300B302CC39E5C5C18450D8CF80CA4 +:10A2700010680E0CB8D5029C1A9B3549190A16AA0B +:10A280002049CFD1300B303CC28E0D8BF60B1068BD +:10A290000E0B2F8BB68C029C1A9B3549190A16AAF5 +:10A2A0002049CFD1300B304CC18E0D8BF60B10688E +:10A2B0000E0B2F7BB68C029C1A9B3549190A16AAE5 +:10A2C0002049CFD1300B305CFEB0FE080D8BF60B71 +:10A2D00010680E0B2F6BB68C029C1A9B3549190A1D +:10A2E00016AA2049CFD1C0BFE0A045C230080699C8 +:10A2F000E0A04535E0A046070D8BF60B10680E0B6D +:10A300002EEBB60C423CE0A045B33008FC194024CB +:10A31000E0A04525E0A045F70097AA001302F1EC64 +:10A32000560400AE0000800100AF0001000080165E +:10A33000010D02F1EC560300000001000D8BF60B3D +:10A3400010680E0B2ECBB68CFB1C009A0D8BF60BF7 +:10A3500010680E0B2EBBB68C029C1A9B3549190A4D +:10A3600016AA2049CFD1C8DEE0A04594300806994E +:10A37000E0A04507E0A045D90D8BF60B10680E0B49 +:10A380002EABB68C425CE0A045853008FC19402419 +:10A39000E0A044F7E0A045C90D8BF60B10680E0B4A +:10A3A0002E9BB68C029C1A9B3549190A16AA204985 +:10A3B000CFD1300B306CFEB0FDA30D8BF60B1068C7 +:10A3C0000E0B2F5BB68C029C1A9B3549190A16AAF4 +:10A3D0002049CFD1300B307CFEB0FD920D8BF60BB7 +:10A3E00010680E0B2F4BB68C029C1A9B3549190A2C +:10A3F00016AA2049CFD1300B308CFEB0FD810D8BD9 +:10A40000F60B10680E0B2F3BB68C1A9C354A030BCB +:10A4100018AB204ACFD1300B309CFEB0FD710D8BB4 +:10A42000F60B106816072F27AE8C0D8C2FFCAC8C0A +:10A43000CFF8E06C00800D8BF60B106800A79D0034 +:10A440001302F1EC560400AF0000800100B00001DF +:10A450000000907E010D02F1EC56030000000100A7 +:10A460000E0BB6DC029C1A9B3549190A16AA204924 +:10A47000CFD1300B302CFEB0FD550D8BF60B106894 +:10A480000E0B972C029C1A9B3549190A16AA2049D3 +:10A49000CFD1300B303CFEB0FD450D8BF60B106874 +:10A4A0000E0B973C029C1A9B3549190A16AA2049A3 +:10A4B000CFD1300B304CFEB0FD350D8BF60B106854 +:10A4C0000E0B974C029C1A9B3549190A16AA204973 +:10A4D000CFD1300B305CFEB0FD250D8BF60B106834 +:10A4E0000E0B975C029C1A9B3549190A16AA204943 +:10A4F000CFD1C29EE0A044E030080699E0A04453CA +:10A50000E0A045210D8BF60B10680E0B97BC423C6A +:10A51000E0A044D23008FC194024E0A04444E0A06C +:10A5200045160D8BF60B10680E0B2D0BB68CFB1C15 +:10A53000009A0D8BF60B10680E0B2CFBB68C029C50 +:10A540001A9B3549190A16AA2049CFD1FEB0FDAC95 +:10A55000E0A044B214941695E0681EB8EA18EB85A2 +:10A56000009FC1001302F1EC560400B0000080010E +:10A5700000B10001000084C3010D02F1EC5603009C +:10A5800000000100E069B851EA193F9EE0A044C410 +:10A59000C123E062999AEA129999E0639999EA13C2 +:10A5A0003FB9089A0A9B04980699E0A044B7C032C4 +:10A5B00004940695300AFC1B402408980A99E0A0F0 +:10A5C0004404E0A044D60D8BF60B10680E0B2CEB68 +:10A5D000B60C425CE0A044823008FC194024E0A0A4 +:10A5E00043F4E0A044C60D8BF60B10680E0B2CCB89 +:10A5F000B68C029C1A9B3549190A16AA2049CFD15C +:10A60000300B306CFEB0FCA00D8BF60B10680E0BFF +:10A61000976C029C1A9B3549190A16AA2049CFD17A +:10A62000300B307CFEB0FC900D8BF60B10680E0BDF +:10A63000977C029C1A9B3549190A16AA2049CFD14A +:10A64000300B308CFEB0FC800D8BF60B10680E0BBF +:10A65000978C1A9C354A030B18AB204ACFD1300B8C +:10A66000309CFEB0FC710D8BF60B106816078F9CAA +:10A670000D8C2FFCAC8CFEB0FC372D6DE3CF80FE33 +:10A680008000C09C0016BF001302F1EC560400B11C +:10A690000000800100B2000100001108010D02F16C +:10A6A000EC5603000000010080013AE280013A907C +:10A6B00080013A9480013A548001394280013AEA9B +:10A6C000202DE06BD10CEA1B8001B70ABB1BF92BD4 +:10A6D00000005C5BC090201BE0800101201BE0803B +:10A6E00001C0E08F02A2E06B1FE4EA1B0000760BC2 +:10A6F000282B178B588BF9BB02001E0BF73B000A67 +:10A70000FE0B001F061D36516A859EB9782BF92A6B +:10A710000004F60A041BBA0B782BF92A0004F60A87 +:10A72000001B2ECB960BBA1B782BF92A0004F60AD5 +:10A73000001B2D8B960BBA2BCB98782BF92A000493 +:10A74000F60A001B2ECB960BBA0B782BF92A0004C5 +:10A75000F60A041BF60B11FFBA1B782BF92A00042A +:10A76000F60A001B2D8B960BBA2BCA08782BF92AF8 +:10A770000004F60A041BF60B11FFBA0B782BF92A1A +:10A780000004F60A001B2ECB960BF60B11FFBA1B2A +:10A79000782BF92A0004F60A001B2D8B960BBA2B96 +:10A7A000C858782BF92A0004006CD5001302F1EC8C +:10A7B000560400B20000800100B300010000AEB3F7 +:10A7C000010D02F1EC56030000000100F60A001B27 +:10A7D0002ECB960BF60B11FFBA0B782BF92A00043F +:10A7E000F60A041BBA1B782BF92A0004F60A001B90 +:10A7F0002D8B960BBA2BC6C8782BF92A0004F60AC3 +:10A80000041BF60B11FFBA0B782BF92A0004F60A89 +:10A81000001B2ECB960BBA1B782BF92A0004F60AE4 +:10A82000001B2D8B960BF60B11FFBA2BC518782B3E +:10A83000F92A0004F60A001B2ECB960BBA0B782BD4 +:10A84000F92A0004F60A041BBA1B782BF92A000423 +:10A85000F60A001B2D8B960BF60B11FFBA2BC38843 +:10A86000782BF92A0004F60A041BBA0B782BF92A74 +:10A870000004F60A001B2ECB960BF60B11FFBA1B39 +:10A88000782BF92A0004F60A001B2D8B960BF60B89 +:10A8900011FFBA2BC1D8782BF92A0004F60A001B45 +:10A8A0002ECB960BF60B11FFBA0B782BF92A00046E +:10A8B000F60A041BF60B11FFBA1B782BF92A0004C9 +:10A8C000F60A001B2D8B960BF60B11FF00E65E00BF +:10A8D0001302F1EC560400B30000800100B4000143 +:10A8E0000000BA9B010D02F1EC56030000000100CC +:10A8F000BA2B9A0B782AF9290004F4090A1B9A1B2F +:10A90000782AF9290004F409001A2ECAB40B9A2BEC +:10A91000782A2FCCF9290000F409001A2D8AB40BEB +:10A92000CA79E06B1FE4EA1B0000760B281B178B2B +:10A93000588BF9BB02002FEBFE0B001FC0CBC07879 +:10A94000C1E8C368C4D8C658C7C8C948782BF92A13 +:10A950000004F60A001B2ECB960BBA0B782BF92AB3 +:10A960000004F60A041B5C3BBA1B782BF92A00048E +:10A97000F60A001B2D8B960BBA2BCBCB782BF92A22 +:10A980000004F60A041B5C3BBA0B782BF92A00047E +:10A99000F60A001B2ECB960B5C3BBA1B782BF92AD0 +:10A9A0000004F60A001B2D8B960BBA2BCA3B782BA2 +:10A9B000F92A0004F60A001B2ECB960B5C3BBA0B5F +:10A9C000782BF92A0004F60A041BBA1B782BF92A03 +:10A9D0000004F60A001B2D8B960BBA2BC8BB782BF4 +:10A9E000F92A0004F60A041B5C3BBA0B782BF92AFF +:10A9F0000010FE001302F1EC560400B400008001C8 +:10AA000000B500010000D023010D02F1EC56030057 +:10AA1000000001000004F60A001B2ECB960BBA1BA7 +:10AA2000782BF92A0004F60A001B2D8B960B5C3B51 +:10AA3000BA2BC72B782BF92A0004F60A001B2ECB61 +:10AA4000960BBA0B782BF92A0004F60A041BBA1BE2 +:10AA5000782BF92A0004F60A001B2D8B960B5C3B21 +:10AA6000BA2BC5AB782BF92A0004F60A041BBA0BE3 +:10AA7000782BF92A0004F60A001B2ECB960B5C3BC0 +:10AA8000BA1B782BF92A0004F60A001B2D8B960BB3 +:10AA90005C3BBA2BC41B782BF92A0004F60A001B76 +:10AAA0002ECB960B5C3BBA0B782BF92A0004F60AE6 +:10AAB000041B5C3BBA1B782BF92A0004F60A001B26 +:10AAC0002D8B960B5C3BBA2BC27BE06B1FE4EA1B21 +:10AAD0000000760BF73B0080588BF9BB02001E0B81 +:10AAE000F73B000AFE0B001F061C334B627A91A94C +:10AAF000782BF92A0004F60A041BBA0B782BF92AE2 +:10AB00000004F60A001B965BBA1B782BF92A000496 +:10AB1000F60A001B00AA0B001302F1EC560400B564 +:10AB20000000800100B60001000045E8010D02F1BF +:10AB3000EC560300000001002ECB960BBA2BCA681E +:10AB4000782BF92A0004F60A001B965BBA0B782BC7 +:10AB5000F92A0004F60A041B5C3BBA1B782BF92A7D +:10AB60000004F60A001B2ECB960BBA2BC8F8782BE4 +:10AB7000F92A0004F60A041B5C3BBA0B782BF92A6D +:10AB80000004F60A001B965B5C3BBA1B782BF92A83 +:10AB90000004F60A001B2ECB960BBA2BC778782B35 +:10ABA000F92A0004F60A001B965B5C3BBA0B782B73 +:10ABB000F92A0004F60A041BBA1B782BF92A0004B0 +:10ABC000F60A001B2ECB960BBA2BC608782BF92A57 +:10ABD0000004F60A041B5C3BBA0B782BF92A00042C +:10ABE000F60A001B965BBA1B782BF92A0004F60ABA +:10ABF000001B2ECB960B5C3BBA2BC488782BF92A12 +:10AC00000004F60A001B965BBA0B782BF92A0004A5 +:10AC1000F60A041BBA1B782BF92A0004F60A001B5B +:10AC20002ECB960B5C3BBA2BC318782BF92A000469 +:10AC3000F60A041BBA0B782B00D0AF001302F1EC1C +:10AC4000560400B60000800100B700010000FA536E +:10AC5000010D02F1EC56030000000100F92A000486 +:10AC6000F60A001B965B5C3BBA1B782BF92A0004A2 +:10AC7000F60A001B2ECB960B5C3BBA2BC198782BA7 +:10AC8000F92A0004F60A001B965B5C3BBA0B782B92 +:10AC9000F92A0004F60A041B5C3BBA1B782BF92A3C +:10ACA0000004F60A001B2ECB960B5C3BBA2B9A0BCA +:10ACB000782AF9290004F4090A1B9A1B782AF92931 +:10ACC0000004F409001AB45B9A2B782A2FCCF929D6 +:10ACD0000000F409001A2ECAB40B2FED5EFF00002D +:10ACE000EBCD40FC204D1897E06CCF14EA1C80019E +:10ACF000B90ABB1B2F8CB90AFAEB0008EF2C000035 +:10AD00005C5C589CF9BC02042FECFE0C001FC09840 +:10AD1000C598CF68CD18C499C489C9D8C119C38949 +:10AD20006E2CEF2B0004F80B041CBA0C6E2CEF2BCE +:10AD30000004F80B001C2ECC980CBA1C6E2B2FC7ED +:10AD4000EF2A0000F60A001B2D8B960BBA2B9A0AED +:10AD5000BA4ABA5CBA6B300CC0F8F80B0036A100E6 +:10AD60001302F1EC560400B70000800100B80001A6 +:10AD700000006DB8010D02F1EC5603000000010067 +:10AD80001501FACAFFF8160A948AE04A8001C04504 +:10AD90001A99F20B0A0A2FFC5C5C583CCF15E06C48 +:10ADA0001FE4EA1C000078069A0CE0A03287E06BF2 +:10ADB000F660EA1B3A1CE0A030A18D0C9A1CE0A0C2 +:10ADC000327DE06BF660EA1B3A1CE0A030978D1CE8 +:10ADD0009A2CE0A03273E06BF660EA1B3A1CE0A00C +:10ADE000308D8D2CCF486E2CEF2B0004F80B041CFB +:10ADF000BA0C6E2CEF2B0004F80B001C2ECC98051F +:10AE0000BA156E2C2FC7EF2B0000F80B001C2D8CF1 +:10AE10009807BA27E06C1FE4EA1C00007806E0629D +:10AE200096A6EA121DA1E063044FEA133F349A0C80 +:10AE3000E0A03244E0A040D004980699E0A040434E +:10AE4000E0A031948D3C0A9CE0A03238E0A040C4E0 +:10AE500004980699E0A04037E0A031888D4C0E9C04 +:10AE6000E0A0322CE0A040B804980699E0A0402B66 +:10AE7000E0A0317C8D5CCAB8E06C1FE4EA1C0000E5 +:10AE800000C639001302F1EC560400B8000080013E +:10AE900000B9000100002D03010D02F1EC56030082 +:10AEA000000001007806E064147BEA1447AEE06518 +:10AEB0007AE1EA153F846E2CEF2B0004F80B041C9A +:10AEC000E0A0320EE0A0409A08980A99E0A0400D58 +:10AED000E0A0315E8DFC6E2C2FC7EF2B0000F80B2D +:10AEE000001C985CE0A031FCE0A0408808980A991A +:10AEF000E0A03FFBE0A0314CED4C0040C7A8E06C67 +:10AF00001FE4EA1C000078066E2CEF2B0004F80BFF +:10AF1000041CA96CE0A031E48DCC6E2C2FC7EF2B64 +:10AF20000000F80B001C985CE0A031DA6CCBE0A0CC +:10AF30002FA18DCC6CCBE06CD70AEA1C3C23E0A09F +:10AF40002FEF8DCCC568E06C1FE4EA1C000078068A +:10AF50006E2CEF2B0004F80B041CED5C004A6E2CE9 +:10AF6000EF2B0004F80B001C2ECC980CED5C004C71 +:10AF70006E2C2FC7EF2B0000F80B001C2D8C980CAB +:10AF80002B26AC0CC368E06C1FE4EA1C00007806BA +:10AF90006E2CEF2B0004F80B041CED5C00506E2CA3 +:10AFA000EF2B0004001256001302F1EC560400B916 +:10AFB0000000800100BA00010000B8C8010D02F1D4 +:10AFC000EC56030000000100F80B001C985CED5CDF +:10AFD00000526E2CEF2B0004F80B001C2ECC980CAA +:10AFE000ED5C00546E2C2FC7EF2B0000F80B001CFB +:10AFF0002E2C980C2AA6AC0CC0E86E2C2FC7EF2B79 +:10B000000000F80B041CE06B1FE4EA1B0000760B49 +:10B010002A8BB60C2FCDE3CF90FCD70380013A5496 +:10B020008001394280011BE880011D38800118CC65 +:10B0300080011978EBCD40E021AD300CBA9CBA8C80 +:10B04000BA9CC1180E9CFEB0FBCD5826C0410E9C88 +:10B05000E0A020025825C0310E9CC79EFB2B0001AA +:10B060002FFBBA9BFB2B000158ABE0840153FB2B59 +:10B070000001585BCF40FB2B0001589BCF00E06CD8 +:10B080003828EA1C0000FB2A0001F80A0327EF0C0D +:10B090000024580CC0D4E06C1FE4EA1C0000780CBB +:10B0A000292C988CEF0B0024180BEF5B0024300B3D +:10B0B0000E9C6ECA746A5D1A1896301B0E9C6ECA7E +:10B0C000746A5D1A189558160098B4001302F1ECD2 +:10B0D000560400BA0000800100BB000100000773A5 +:10B0E000010D02F1EC56030000000100C0305815BC +:10B0F000C081EF2C00265C5C6EBB764B5D1BCC1BCD +:10B100005826C0305825CBD1306BFACCFFD46EBA5C +:10B11000745A5D1ACB60EF2C00042FFCAECCEF2CE0 +:10B120000004EF3B000CF60C1900C035300CAECC1F +:10B13000300CBA8CC298FACCFFD4FB2A0000F80A73 +:10B14000071BA96BFB290000F809001C199C180BB0 +:10B15000FACCFFCCFB290000F8090A1BFACCFFCC83 +:10B16000FB2A0000F80A041C6E2BEF2A0004EF39BA +:10B17000000CFB2E0000F20E034AF60A0A1CFB2B01 +:10B1800000002FFBBA8BFB2B0000EF3C0010F80BEC +:10B190001900FE94FF6BFB2B00015C5B589BF9BB15 +:10B1A00002052FEBFE0B001FC098C278C3C8C5185C +:10B1B000C948CD5BCC1BCAB8C9D8FACCFFD4FB2A8E +:10B1C0000000F80A001C199BA96BFACCFFD4FB29DC +:10B1D0000000F809071C180BE06C06A0EA1C000030 +:10B1E000FB290000F809041C180BFACC00143000ED +:10B1F0001302F1EC560400BB0000800100BC00010A +:10B200000000135B010D02F1EC5603000000010089 +:10B21000FFCCFB290000F8090A1BCB3BFACCFFD47A +:10B22000FB2A0000F80A001C199BA96BFACCFFD47A +:10B23000FB290000F809071C180BFACCFFCCFB29EE +:10B240000000F8090A1BC9DBFACCFFD4FB2A000076 +:10B25000F80A001C199BA96BFACCFFD4FB2900004B +:10B26000F809071C180BFACCFFCCFB290000F809E1 +:10B270000A1BC87BFB2B0000580BC161FACCFFD422 +:10B28000FB2A0000F80A070BA96BFACAFFD4FB2CB3 +:10B290000000180A159C180BFACCFFCCFB29000003 +:10B2A000F8090A1BC6EBFB2B0000581BC0E1FACBC8 +:10B2B000FFD4FB2C0000180B179CFACBFFCCFB290A +:10B2C0000000F6090A1CC5DBFB2B0000582BFE9181 +:10B2D000FF59FACBFFD4FB2C0000180B179BA96B6E +:10B2E000FACAFFD4FB2C0000180A15AC180BFACCD4 +:10B2F000FFCCFB290000F8090A1BC43BFACCFFD4A1 +:10B30000FB2A0000F80A070CFACBFFCCFB2900004F +:10B3100000D82D001302F1EC560400BC000080019F +:10B3200000BD0001000079E3010D02F1EC560300BD +:10B3300000000100F6090A1CC36BFACCFFD4FB2AFB +:10B340000000F80A070CFACBFFCCFB290000F60935 +:10B350000A1CC29BFACCFFD4FB2A0000F80A071B88 +:10B36000A96BFB290000F809001C199C180BFACCEA +:10B37000FFCCFB290000F8090A1BC15BE0671FE452 +:10B38000EA1700006E0CF91B005E580BC050292C08 +:10B39000988CE0A07E816E0C798B580BC1E0300B4D +:10B3A000FB5B0064FB6B003D30AAFB6A003EFB6B5D +:10B3B0000040FB6B0041302BFB6B003C292C988C30 +:10B3C000FB5C0064FACCFFC41A9B32C9190A16AAA6 +:10B3D0002049CFD1E0A04C102E6DE3CF90E0D703F1 +:10B3E0008000FA8C8001BA60800155C0D431E066DB +:10B3F0000AD0EA160000ED3C0159EC0C0023ED32B6 +:10B40000015AE0420020C191ECFC0464E6FB0164B7 +:10B41000E0A02D0AED4C0464ECFC0468E6FB01E4BA +:10B42000E0A02D02ED4C0468ECFC046CE6FB026429 +:10B43000E0A02CFA009690001302F1EC560400BD37 +:10B440000000800100BE00010000EC28010D02F1A7 +:10B45000EC56030000000100ED4C046C409CE74CEE +:10B460000164ECFB0464E6FC0164E0A02D5D18952A +:10B47000ED45046440ACE74C01E4ECFB0468E0A05B +:10B480002D531894ED44046840BCE74C0264ECFB77 +:10B49000046CE0A02D491897ED47046CE0420020B1 +:10B4A000C064ED3C015A2FFCED6C015AED3C015A91 +:10B4B000E04C0020C174E0A02F5718920A9C049B16 +:10B4C000E0A02DFCE74C02E4089C049BE0A02DF6D4 +:10B4D000E74C03640E9C049BE0A02DF0E74C03E4D2 +:10B4E000C248FC113FA00A9CE0A03DE2300802994E +:10B4F000E0A03D55E0A02EA6E74C02E4089CE0A0A9 +:10B500003DD730080299E0A03D4AE0A02E9BE74CD1 +:10B5100003640E9CE0A03DCC30080299E0A03D3FC2 +:10B52000E0A02E90E74C03E4ED3C01592FFCED6CBC +:10B530000159ED3C0159E04C0020C041300CED6C4C +:10B540000159D83A80011A60D4313002E0670AD03C +:10B55000EA170000EF30015A00D3FD001302F1ECAE +:10B56000560400BE0000800100BF0001000053939C +:10B57000010D02F1EC560300000001005820C02428 +:10B58000D83A3001C0382FF22FF10031C4B4EF3C6B +:10B590000159F80B1518C04131FC31EBC078201C63 +:10B5A000189B201B580BC0242E0BEE0B0026EE0C14 +:10B5B0000025EAFC0164ECFB0164E0A02C59E0A04A +:10B5C0003D89BFDBE0A02E501893EAFC01E4ECFBC0 +:10B5D00001E4E0A02C4DE0A03D7DBFDBE0A02E44C7 +:10B5E0001894EAFC0264ECFB0264E0A02C41E0A0A9 +:10B5F0003D71BFDBE0A02E3818963015EA153F806C +:10B60000069C0A9BE0A02E7ACBF2089C0A9BE0A045 +:10B610002E75CBA20C9C0A9BE0A02E70CB52300260 +:10B62000CB4B5C525952CAD5DA3A0000EBCD40E020 +:10B6300020DD18971696411C50AC412C50BC413C63 +:10B6400050CCFACCFFD8780A500A781A501A782AC7 +:10B65000502ACF1EE0650AD0EA150000EB3C0158E5 +:10B66000582CC3F1F7D6C0100E9CE0A01911F7D6E4 +:10B67000C010FACCFFD8FEB0C8430A9C00C7B30084 +:10B680001302F1EC560400BF0000800100C000016D +:10B69000000052FB010D02F1EC5603000000010016 +:10B6A000FE3CFF30E0A07BDAEAFC00D0581CC14130 +:10B6B000E0A058B60A9CFE3CFF30E0A07BCF0A9B7E +:10B6C000FE3BFF30FE35FF580A9A305CB709B528BB +:10B6D000201CCFD1C1F80A9CFE3CFF301A9B328956 +:10B6E000190A16AA2049CFD1C14DE0A0027BC12082 +:10B6F000EB1C00DE580CC0E1301CEB6C0158E0A0E4 +:10B700007A8BC088581CC061C44FC040302CEB6C91 +:10B7100001582F3DE3CF80E08000F2108000508080 +:10B720008001717C8001B7B88001B574E06C0AD0EB +:10B73000EA1C0000F93C01585EFC0000580C5E0D4C +:10B74000E06B0AD0EA1B0000F6FB01603549170ADE +:10B7500018AA2049CFD1254C5EFD0000EBCD4080DA +:10B76000F80A1518C111E0670AD0EA170000169C04 +:10B77000E0A02E1EEF4C0150FE37FEB40E9CE0A060 +:10B780007B3DE3CF8080581CC111E0670AD0EA17E7 +:10B790000000169CE0A02E0CEF4C014CFE37FEB4CE +:10B7A0000059AF001302F1EC560400C00000800104 +:10B7B00000C1000100003E57010D02F1EC560300EC +:10B7C000000001000E9CE0A07B2BE3CF8080582C72 +:10B7D000C0C1E0670AD0EA170000EF5B0154FE37F2 +:10B7E000FEB40E9CE0A07B1CE3CF8080D421169792 +:10B7F0001496E0650AD0EA150000300A300B0A986A +:10B8000030A9B12A2019CFE1910A0A9BFE3BFB8C9B +:10B8100030083009169E30AABD28201ACFE19D08B5 +:10B820000A9B2ACB169E30AABD28201ACFE19D087C +:10B830000A9AFE3AFB8C0A9B1494305EB709A92839 +:10B84000201ECFD10A9BFE3BFB8CEB4B01600A9B79 +:10B85000FE3BFF0830083009169E30AABD28201A8A +:10B86000CFE19D080A9BFE3BFEB4B71997280A9BBF +:10B87000FE3BFF30B719F6E90008F6E90010F6E9DB +:10B880000018F6E900200A9BFE3BFF58B719F6E9BD +:10B890000008F6E90010F6E90018F6E90020E0A03B +:10B8A0002D99EB4C01500E9CE0A02D94EB4C014CDB +:10B8B000EB560154E0A056940A9CFE3CFEB4E0A076 +:10B8C0007AAFE06C00499F001302F1EC560400C10E +:10B8D0000000800100C200010000AB9C010D02F1DC +:10B8E000EC560300000001002710EB5C004AEB5C03 +:10B8F000004C3007EB570044EB5700463016EB6620 +:10B900000158EB670159EB67015A300CEB4C0464AA +:10B91000EB4C0468EB4C046CE06C0ACCEA1C0000B5 +:10B920009907EB470470E0A071F5EB67015BEB66EC +:10B93000015CE06CCF24EA1C8001FEB0D6CBD82A93 +:10B9400080011D0C80016F188001B7588001A62866 +:10B9500080006FE85EFD0000D42120ADE0670AD0D2 +:10B96000EA170000EEF500AC410C0A3CC081FB1B5D +:10B97000004AEF1A00B6143BE08000B218255805C3 +:10B98000C064E06C9681EA1C00981805418CEEFBBF +:10B9900000CCE0A02AA31896300BE0A02CF1C092B6 +:10B9A000E06C2400EA1C49740C9BE0A02B0518965F +:10B9B000416CEEFB00C4E0A02A911894300BE0A08B +:10B9C0002CDFC092E06C2400EA1C4974089BE0A0C4 +:10B9D0002AF31894417CE0A018E5EF3B015C201BA2 +:10B9E000C040201BC3C0C498008F9B001302F1EC21 +:10B9F000560400C20000800100C3000100001427AB +:10BA0000010D02F1EC56030000000100FACCFFC466 +:10BA10001A9B3289190A16AA2049CFD10E982AC832 +:10BA20003009089A0C9B0A9CC72CEF3C015B0A0C5E +:10BA3000EF6C015BEF3C015B583CC315FACCFFC4D3 +:10BA40001A9B3289190A16AA2049CFD10E983009BB +:10BA5000EEFA00886FDB6F5CC5ACEF3C015B2FFC3E +:10BA6000EF6C015B0E9C2ACC300A300B189830A981 +:10BA7000B12A2019CFE1910A302CEF6C015CC0F89B +:10BA8000FACBFFC41A9A3288170914A92048CFD1DB +:10BA90000E981899089A0C9B0A9CC39CFB1C004AA0 +:10BAA000580CC1110E9C2ACC300A300B189830A9C2 +:10BAB000B12A2019CFE1910A300CEF6C015B301CE8 +:10BAC000EF6C015CFACAFFC40E9CFE3CFF58189E46 +:10BAD000305BB509BD28201BCFD1EF4701600E9B1D +:10BAE000FE3BFB8C0E9C169E30AAB909BD28201A7D +:10BAF000CFD178089D080E9CFE3CFB8CEF4C01607A +:10BB00002F6DD82A800117F08000F4B800FC8F0058 +:10BB10001302F1EC560400C30000800100C40001D0 +:10BB20000000000F010D02F1EC56030000000100BF +:10BB3000EBCD40F820DD1694149312951097FB1668 +:10BB4000005AEF5600480E9A0A9BCD3CE06C0ACC96 +:10BB5000EA1C0000780C580CC1116E8C089BE0A008 +:10BB60002A4F8F8C6E8CE0A0024F8F8CEF560046D0 +:10BB7000FB1C0058EF5C0044C438E06C0AD0EA1C9F +:10BB80000000FE3CFEB4780A50AA781A50BA782A0F +:10BB900050CAFACCFFB41A9B3289190A16AA204956 +:10BBA000CFD10A9CC54D6E8BE0A02A2A8F8C6E8C5B +:10BBB000E0A0022A8F8C301B0A9CE0A02BF9C11355 +:10BBC0005836C071306CEF5C0046EF5C0044C188B1 +:10BBD0005846C161308CEF5C0046EF5C0044C10800 +:10BBE0005836C071307CEF5C0046EF5C0044C08882 +:10BBF0005846C061309CEF5C0046EF5C0044419CBD +:10BC00008FCC6EDC069BE0A029FB8FDC6EDCCE5D6A +:10BC10008FDC41BCE0A03AB8E0681EB8EA18EB85BA +:10BC2000E069B851EA193FAEE0A03A25E0A02B76D2 +:10BC300000747B001302F1EC560400C40000800184 +:10BC400000C5000100006AB7010D02F1EC560300C7 +:10BC5000000001008FEC6EEC301BEA1B41C8E0A035 +:10BC60002BB9C043FC1C41C88FEC415CEF4C004039 +:10BC7000300CEF1B0046580BC031EF4C00408FFCDE +:10BC8000417CEF4C0050FB1C00622B47AE0C2F3D5B +:10BC9000E3CF80F8D401E0A07A49E04C0BB95F2CE7 +:10BCA000D802D7038001B9D4EBCD40C01896169CBA +:10BCB0001497EF1B0048583BC151301BE0A02B8A62 +:10BCC000C0936E4C0C0C8F4C6E4CCC9D8F4CE3CFC4 +:10BCD00080C06E5C0C0C8F5C6E5CCC1D8F5CE3CF07 +:10BCE00080C0EF1B0048584BC131301BE0A02B72C5 +:10BCF000C0936E6C0C0C8F6C6E6CCB1D8F6CE3CF95 +:10BD000080C06E7C0C0C8F7C6E7CCA9D8F7CE3CFD8 +:10BD100080C00000EBCD40F81896169514976E0C75 +:10BD20000C0C8F0C6E0CC9BD8F0C0A9CE0A03A3E27 +:10BD3000BFDB30183009E0A03A57C4D3E0640AD022 +:10BD4000EA140000E8FC0104585CC392E0630ACCEA +:10BD5000EA1300000082FC001302F1EC560400C557 +:10BD60000000800100C600010000FF7C010D02F10F +:10BD7000EC56030000000100660B580BC321584C21 +:10BD8000C1A16E3B180B8F3B6E3CC7BD8F3C0E9A1A +:10BD90000A9BE8FC0104C9BF6E3C0C0C8F3C6E3C56 +:10BDA000C70D8F3C0E9A0A9B0C9CC91FC58C301C7A +:10BDB000870CC1082BA78E8C584CC070E8FC00FC87 +:10BDC0000C0CE94C00FCC068E8FC01000C0CE94CD0 +:10BDD0000100E8FC01040C0CE94C0104E3CF80F8FD +:10BDE0006E3C0C0C8F3C6E3CC4CD8F3C0E9A0A9B73 +:10BDF0000C9CC6DFE3CF80F8EF1C0046203CC0401F +:10BE0000201CC090C0F86E1C0C0C8F1C6E1CC39DB7 +:10BE10008F1CC0E86E2C0C0C8F2C6E2CC32D8F2C1D +:10BE2000C0786E1C0C0C8F1C6E1CC2BD8F1CE06495 +:10BE30000AD0EA140000E8FC0104585CC042580C27 +:10BE4000C020C19CC0CC300CE06B0ACCEA1B0000C7 +:10BE5000970CE3CF80F8D70380013A90E06C0AD0CA +:10BE6000EA1C0000300BF94B00FCF94B0100F94BC8 +:10BE700001045EFDE06C0AD000A5AD001302F1ECF8 +:10BE8000560400C60000800100C70001000040C742 +:10BE9000010D02F1EC56030000000100EA1C000055 +:10BEA000F8FB00FC781A160A991AF8FB01002F8C8F +:10BEB000780A160A990A5EFDD431189330023005CB +:10BEC0003004FB1C0032203CC040201CC370C6A8BC +:10BED000411CE0A0398F14961697E068999AEA18E9 +:10BEE0009999E0699999EA193FB9E0A038FA3008C0 +:10BEF000FC19400CE0A037E0E0A02A461895300B72 +:10BF0000069CE0A02A97C4E3069CE0A03973149035 +:10BF10001691E06ACCCDEA1ACCCCE06BCCCCEA1B13 +:10BF20003FFC0C980E99E0A038DC00980299E0A044 +:10BF300038D8E0A02A291894C358411CE0A0395AE7 +:10BF400014961697E068999AEA189999E069999970 +:10BF5000EA193FC9E0A038C53008FC19400CE0A040 +:10BF600037ABE0A02A111895300B069CE0A02A629E +:10BF7000C193069CE0A0393E14901691E06ACCCDA6 +:10BF8000EA1ACCCCE06BCCCCEA1B3FEC0C980E99B7 +:10BF9000E0A038A700980299E0A038A300622E0024 +:10BFA0001302F1EC560400C70000800100C8000134 +:10BFB0000000D72C010D02F1EC5603000000010037 +:10BFC000E0A029F41894411C300BE0A077C7C19081 +:10BFD00040B7300B0E9CE0A077C1C1300E9CE0A0B2 +:10BFE000391B3008FC19404EE0A0388D1498169982 +:10BFF000300AFC1B3FF0E0A038C3E0A029D718921C +:10C00000049CE0A0390914921693413CE0A0390445 +:10C01000149616970A9C089BE0A0283AE0A038FCEA +:10C02000E068147BEA1847AEE0697AE1EA193F74E8 +:10C03000E0A038690C980E99E0A03865049806993C +:10C04000E0A03861E0A029B2D832D70380013718C8 +:10C0500080011C948001B798800139BC80013A545A +:10C060008001394280011BE8EBCD40801897E06BDE +:10C070002401EA1B4974E0A029E3C093E06C24008A +:10C08000EA1CC9740E9BE0A0280318970E9CE3CD10 +:10C0900080800000EBCD40801897E06B2401EA1B04 +:10C0A0004974E0A029CDC093E06C2400EA1CC97457 +:10C0B0000E9BE0A027ED18970E9CE3CD8080D70360 +:10C0C00000D94C001302F1EC560400C800008001B6 +:10C0D00000C9000100009797010D02F1EC56030022 +:10C0E0000000010080011C7C800118CCE06B96816F +:10C0F000EA1B0098163C5E3CE06B6980EA1BFF6718 +:10C10000160C5EFC3FFB201C5C5C598CF9BC0203E6 +:10C110001E0C19EC180F1A1A1A1C1A1A1A1A1A1AC3 +:10C120001A1A1A1A1A1A1A1C1C1C1C1C1A1A301B4E +:10C13000169C5C6C5EFC0000300B201C5C5C58DCC8 +:10C14000F9BC02011E0C19EC180F10121012121279 +:10C150001212101012101000301B169C5C6C5EFC4A +:10C160003FFB599CF9BC02121E0C19EC180F1C1C49 +:10C17000201C1C201C1C2020201C242028281C28BB +:10C180002A2A2A2A2A1C2000302BC068301BC048CB +:10C19000304BC028303B169C5C6C5EFCEBCD40C045 +:10C1A000E06720CCEA170000E0A078408F0CE0A008 +:10C1B0005539E0A078358F1C3006C0D85986C0713B +:10C1C000E06A9E84EA1A8001F74A031C787C5D1CB1 +:10C1D0002FF65C665996E08400DB6E1BEC0C1505AF +:10C1E000160C300A002723001302F1EC560400C994 +:10C1F0000000800100CA00010000025C010D02F194 +:10C20000EC56030000000100B88AB89A3FF9B8A9BB +:10C21000B8BAB83AB8CA5836C081E06AA87CEA1AF7 +:10C220008000F74A007CCE5B5816C071E06AB2A06D +:10C23000EA1A800197FACDDB5826C081E06AADE8A2 +:10C24000EA1A8001F74A005CCD4B5806C0B0592667 +:10C25000C0905936C0705946C0505956C0305966C2 +:10C26000C201E06BBA58EA1B8001992BE06BBA64FB +:10C27000EA1B8001993BE06BBA74EA1B8001994B81 +:10C28000E06BBA5CEA1B8001995BE06BBA68EA1B61 +:10C290008001996BE06BBA64EA1B8001997BCA9BB1 +:10C2A0005846C081E06AB0B8EA1A8001F74A009C9B +:10C2B000CA0B5856C081E06A5854EA1A8001F74AFE +:10C2C00000BCC97B5866C081E06AAFBCEA1A800135 +:10C2D000F74A00DCC8EB5876C081E06A9320EA1A7E +:10C2E0008001F74A00FCC85B5886C081E06A72C8CA +:10C2F000EA1A8001F74A011CC7CB5896C081E06A50 +:10C300004068EA1A8001F74A002316001302F1EC94 +:10C31000560400CA0000800100CB00010000BDE708 +:10C32000010D02F1EC56030000000100013CC73B87 +:10C3300058A6C081E06AB160EA1A8001F74A015C40 +:10C34000C6AB58B6C081E06AB010EA1A8001F74A5D +:10C35000017CC61B58C6C081E06AAE4CEA1A800157 +:10C36000F74A019CC58B58D6C081E06A8F30EA1A23 +:10C370008001F74A01BCC4FB58E6C081E06A5D2435 +:10C38000EA1A8001F74A01DCC46B58F6C081E06A02 +:10C390008C54EA1A8001F74A01FCC3DB5906C081BC +:10C3A000E06A9088EA1A8001F74A021CC34B5916CA +:10C3B000C081E06A66ACEA1A8001F74A023CC2BB5F +:10C3C0005976FE91FF21E06A9810EA1A8001F74A37 +:10C3D00002FCC21BE3CF90C08001BA448001743CD0 +:10C3E0008001BA38EBCD40FC209D1897169430168A +:10C3F000EE051505E06320CCEA13000058B4C1F146 +:10C4000066120A02059C581CC1A5F9D7B008C9FEDE +:10C41000581CC1550592F9D7B008C99EF8021900F9 +:10C42000C0E50E9CC0CD1896300C661B0052C300B0 +:10C430001302F1EC560400CB0000800100CC000197 +:10C440000000A9CF010D02F1EC560300000001002D +:10C450000A0BB69CE06CCDF4EA1C8001FEB0D1EE74 +:10C46000661C0A0C198B581BC184199B581BC1549C +:10C47000300BB88BB89BFACCFFC01A9B3249190A13 +:10C4800016AA2049CFD10E9CC3CC582CC031302CD9 +:10C49000C338583CC021303658A4C071661C0A0C01 +:10C4A000198B2FFBB88BC12858B4C1015837C081F4 +:10C4B000661C29FC198C580CC031FEB0EEDF661CDE +:10C4C0000A0C2FFC198B2FFBB88B661C1805660C09 +:10C4D000798A2A4C988BFAEB000C0B9A0B8BFAEBAF +:10C4E00000045007E06CCDF4EA1C80012F8CFEB0F4 +:10C4F000D1A50C9C5C6C2F7DE3CD80FC8000AA282C +:10C50000D421209D18973016E06520CCEA15000054 +:10C510006A1CEE0415051804F9D7C008C58EA8AC2E +:10C52000300CA8BCA83CFACCFFC81A9B3249190AA7 +:10C5300016AA2049CFD1682C5D1C582CC031302C54 +:10C54000C0F8583CC0313036C0986A0B778A301C2E +:10C55000006D70001302F1EC560400CC0000800165 +:10C5600000CD00010000C377010D02F1EC5603007D +:10C5700000000100F807094C184AF74A00600C9CBB +:10C580005C6C2F7DD8220000EBCD40FE205D18971B +:10C5900016943016EE051505E06320CCEA13000072 +:10C5A00066120A02059C582CC1A5F9D7B008FEB046 +:10C5B000FDF3581CC1450591F9D7B008FEB0FDEC5C +:10C5C000F8011900C0C5F9D7B008FEB0FDE5A49C7C +:10C5D000E06CCD84EA1C8001FEB0D142661BF605FA +:10C5E000000C198A581AC044199A581AC30558A43D +:10C5F000C0C1198B581BC065198BFE3BFF01B88B5E +:10C60000C198300BB88BC16858B4C141199A581AF7 +:10C61000C0752FFC198AFE3AFF01B88AC038300A6B +:10C62000B89A5837C07129FB178C580CC031FEB02E +:10C63000EE49661C0A0C198B580BC091199C580CBA +:10C64000C0610E9CC20C583CC0213036661C1805D7 +:10C65000660C798A2A4C988BFAEB000C0B9A0B8BA0 +:10C66000FAEB00045007E06CCD84EA1C80012F8CAB +:10C67000FEB0D0F60060D5001302F1EC560400CDF8 +:10C680000000800100CE0001000056BC010D02F147 +:10C69000EC560300000001000C9C5C6C2FBDE3CD48 +:10C6A00080FED7038000AA4CD42118973016EE05DF +:10C6B0001505E06420CCEA140000681C0A0C783CE4 +:10C6C0005D1C583CC0213036F9D7B008C8AD583C85 +:10C6D000C0213036681C18053FFCAAAC300CAABC3F +:10C6E000AA3C680C798B301AF407094A148BF94B71 +:10C6F00000600C9C5C6CD822EBCD40C0202D1897BC +:10C70000E06620CCEA1600006C1BEE0C1505160C3A +:10C71000300BB88BB89BF9D7B010CC7F6C0C7986F6 +:10C72000BB17E06CCFC4EA1C8001FEB0D0AB2FED8C +:10C73000E3CF90C0EBCD40F822FD18961697301C41 +:10C74000FB6C005DE06520CCEA150000FACCFFA090 +:10C750006A0B35C9170A18AA2049CFD1FACCFFA015 +:10C760001A9B35C9190A16AA2049CFD10A9C2F8CC9 +:10C77000E0A002563004C0E8583CC061FB64005C95 +:10C78000303CFB6C005D300C6A1B1603A6BC2FF41A +:10C790005C645994C2F4301C00C095001302F1ECA3 +:10C7A000560400CE0000800100CF00010000E90720 +:10C7B000010D02F1EC56030000000100F804094BE2 +:10C7C0006A0C798C186BCF60E80315056A1B060BA1 +:10C7D000F72C0002580CCEE52FEBF72C0000E0A060 +:10C7E0004CC96A1B060B17BA2FFAB6BA17BAAF3A7A +:10C7F000183ACE05764C5D1C582CCD11FB64005CBC +:10C80000302CFB6C005DFACCFFA4198BAC8B199B10 +:10C81000AC9B0C9CC088FACCFFA4198BAC8B199BE9 +:10C82000AC9B0C9C2D1DE3CD80F8D703800168B430 +:10C83000300B586CC022301B169C5C6C5EFC0000F8 +:10C84000EBCD40FC204DFB3600305C66FB23002D19 +:10C85000E6071505E06520CCEA1500006A140E0411 +:10C86000E92C00020C3CC0915003E06CCA8CEA1C1D +:10C870008001FEB0D019C618F9D6B008CDAFC0F10E +:10C880002FE4E9270000FAE700045003E06CCA8CAB +:10C89000EA1C80012F4CFEB0D007C4F83004C22837 +:10C8A0006A1C0E0C98BCF8040A4CA19CC1A2301A58 +:10C8B000F7D6B008F9D4B008E0A04B92008BE200A4 +:10C8C0001302F1EC560400CF0000800100D00001FB +:10C8D0000000F96F010D02F1EC56030000000100A9 +:10C8E000C1216A1C0E0C2FECF92B00000C9AFAEBFC +:10C8F00000080892BB13E06CCA8CEA1C80012E0C65 +:10C90000FEB0CFE42FF45C6458A4CDD53004C21837 +:10C9100098BBF6040A4BA19BC1B2301A2FECF92B3D +:10C920000000F9D4B008E0A04BBFC1216A1C0E0C76 +:10C930002FECF92B00000C9AFAEB00080892BB13BD +:10C94000E06CCA8CEA1C80012C8CFEB0CFBF2FF4A7 +:10C950006A1C0E0C5C6458A4CDC5B8A62FCDE3CFDD +:10C9600080FCD70380016720EBCD40803007E06C6E +:10C9700020CCEA1C0000780C798CEDBC000CC07255 +:10C98000E06C00C8E0A06D60C02030170E9C5C6CAD +:10C99000E3CD80808001AB64EBCD40F81897300682 +:10C9A0003005C1E8EA041505E06320CCEA13000075 +:10C9B000661B080B300CB6CC301CF805094A660C17 +:10C9C000798C186AC0B0F9D7B008765B5D1BC0607F +:10C9D000301C661B1604A8CC30162FF55C655995E3 +:10C9E00000D5A9001302F1EC560400D0000080012C +:10C9F00000D100010000EDD2010D02F1EC56030060 +:10CA000000000100CE250C9C5C6CE3CD80F800009A +:10CA1000300BC0C8300AE06C20CCEA1C000078194A +:10CA2000F60C15051809B2CA2FFB5C6B599BCF3564 +:10CA30005EFD0000301BF60C094BE06C20CCEA1CBC +:10CA40000000780C798C186B5F1C5EFCEBCD40FC11 +:10CA5000202D18933015E6071505E06620CCEA1660 +:10CA600000006C1C0E0C98BC581CC2653004C048F9 +:10CA700030352FF45C6458A4C1F46C190E0992BBD4 +:10CA8000301CF804094C186BF604084C5C6C581CFC +:10CA9000CF11301A2FE9F32B0000F9D4B008E0A031 +:10CAA0004B15CE700892BB13E06CCFDCEA1C800102 +:10CAB000FEB0CF1ECDFB0A9C5C6C2FEDE3CD80FC5D +:10CAC000800167C480006FE8EBCD4080216D18972E +:10CAD000300CFB5C0054FB6C002D30ABFB6B002E6C +:10CAE000FB6C0030FB6C0031EDB70002C272305CB1 +:10CAF000CA2FC110304CFB6C002C305CFB6C002D3D +:10CB0000FACCFFD400C1B0001302F1EC560400D1FE +:10CB10000000800100D2000100007819010D02F12F +:10CB2000EC560300000001001A9B32C9190A16AA2C +:10CB30002049CFD1E0A041DA302CC8FFC110304CE1 +:10CB4000FB6C002C302CFB6C002DFACCFFD41A9B14 +:10CB500032C9190A16AA2049CFD1E0A041C7EDB7C2 +:10CB60000004C142308CC79FC110303CFB6C002CCC +:10CB7000308CFB6C002DFACCFFD41A9B32C9190AF9 +:10CB800016AA2049CFD1E0A041B12EADE3CF8080DD +:10CB9000800155C0D421E02D03AC18971696300CB7 +:10CBA000FB6C00683005C1C8E06B20CCEA1B0000BC +:10CBB000301CF805094A760C798C186AC0F0761C8E +:10CBC000EA0A1505180AF52C0004581CC071FACBA6 +:10CBD000FF98FACCFF94746A5D1A2FF55C6559953D +:10CBE000CE450D8BFB3C0068180B58BBC2450D8C25 +:10CBF000FB350068180520A55C65E9D5B008C1586B +:10CC0000E80C10680E0C189B1A9A3688170914A99C +:10CC10002048CFD1E805010BF60B10680E0B19ACBC +:10CC20005C6CC65C2FF45C64002DC1001302F1EC57 +:10CC3000560400D20000800100D300010000C7A20A +:10CC4000010D02F1EC560300000001000D8C1834B8 +:10CC5000CEA50D8C1825AC853005C198FACBFF9474 +:10CC6000EA0C1068160C189B1A9A3688170914A932 +:10CC70002048CFD10D8BF60B10680E0B19AC5C6CF5 +:10CC8000C48C0D8C2FFCAC8C2FF55C65FB3C0068D4 +:10CC90001835CE55FE3DFC54D82A0000D401300A88 +:10CCA000589CC061581BC041E0A03700301A149C4A +:10CCB0005C6CD8028001415CE06B20CCEA1B000078 +:10CCC0002F8B32C9170A18AA2049CFD122CC5EFC7B +:10CCD000400B990B401B991B402B992B403B993BD8 +:10CCE000404B994B405B995BFB0B004AF95B00188A +:10CCF000FB0B004CF95B001AFB0B004EF95B001CB0 +:10CD000040CB998B40FB999B410B99AB5EFD00009A +:10CD1000202C5C5C597CF9BC02021E0C19EC180F2B +:10CD2000801AAE8080808062808092808080808047 +:10CD3000AEAEAEAEAE8080001B8CB68C1B9CB69C9B +:10CD4000583CC0311BCCB6CC1BACB6AC00788400D0 +:10CD50001302F1EC560400D30000800100D400015E +:10CD60000000D38A010D02F1EC560300000001001F +:10CD70001BDCEDBC0007C0B3B6DC2F8BFACCFFF890 +:10CD80003109192A16BA2029CFD15EFDE06C008046 +:10CD9000B6DC2F8BFACCFFF8330AB909B728208A02 +:10CDA000CFD15EFD1B8CB68C1B9CB69C1BACB6AC6D +:10CDB000169C2FCCFACAFFFC3648150918A9204842 +:10CDC000CFD11B8CB68C1B9CB69C1BACB6AC1BCCC1 +:10CDD000B6CC5EFD1B8CB68C1B9CB69C1BACB6AC5B +:10CDE0002FCBFACCFFFC30A9192A16BA2029CFD1B3 +:10CDF0005EFD0000B18CF9DCC001EC1C00015EFCA2 +:10CE0000D401201CC060201CC070201CC080D80A27 +:10CE1000E0A06648D80AE0A06663D80AE0A0667E73 +:10CE2000D80AD7038001A1308001A16C8001A1A89C +:10CE3000D401201CC060201CC070201CC080D80AF7 +:10CE4000E0A0663ED80AE0A06659D80AE0A0667461 +:10CE5000D80AD7038001A14C8001A1888001A1C418 +:10CE6000201CC080201CC0C0201CC0F0201C5E0FF5 +:10CE7000001D0D001302F1EC560400D400008001E7 +:10CE800000D500010000B932010D02F1EC5603009B +:10CE9000000001005EFDFE7C1814780CF9DCC00176 +:10CEA0005EFC486C780CF9DCC0015EFC484C780CE8 +:10CEB000F9DCC0015EFCD703FFFF1864FFFF1850C8 +:10CEC000EBCD40801897F9D7C008CDDFCFD0E3CFA6 +:10CED00080800000300B990B5EFD0000780AE01A9C +:10CEE000E0FFF5EB108B990B5EFD0000780AE21A6B +:10CEF000FFFD990A582B5E3D780AA1BA990A780A73 +:10CF0000201BAF7BE61BFFFF144B990B5EFD00005F +:10CF1000EBCD40E0189616951497300BCDCF0A9BB9 +:10CF20000C9CCDDF0E9B0C9CCE2F362C8D1CE06C08 +:10CF3000B400EA1C04C48D2CE46C00048D3C300C5D +:10CF40008D4CE3CF80E00000FE7C1814780CA99C87 +:10CF5000F9DCC0015EFC0000EBCD408018970E9C10 +:10CF6000CF4FCFE0E3CF8080E06C054CEA1C00009F +:10CF7000F92B00005C5BC060202BC070201BC0A0A0 +:10CF80005EFDE07CC1385EFCE06C5A00EA1C026287 +:10CF90005EFCE06C002E0D001302F1EC560400D58F +:10CFA0000000800100D6000100002CF9010D02F103 +:10CFB000EC560300000001000E00EA1C07275EFC8F +:10CFC000D401CE5FA38CD802D401189B302CE0A0F2 +:10CFD00054EFD80A80017FF4EBCD40C01896169725 +:10CFE000CF0F8F0CFE7C44001836C04130BCCEDF22 +:10CFF000C078FE7C48001836C03130CCCE6F0E9B16 +:10D000000C9CE0A02B53E3CD80C0D70380012CF013 +:10D01000EBCD4080E06C0160EA1CAA004B5B970CF2 +:10D020004B1C780CA1DC4B0B970C300CE0A062F889 +:10D03000E0A03926311CEA1CA500FE6B0000971CFD +:10D040003007FE6C00009907304CEA1CAA004A9B8E +:10D05000970CFE7C14049907308CEA1CAA00970CEC +:10D060004A5C990730CCEA1CAA00970C4A3C990705 +:10D07000310CEA1CAA00970C4A1C9907E0A0685AD8 +:10D080004A1C9907FC1C0FF84A0B970C4A1C780C99 +:10D090003447EA17AA004A0B9707A5DC49DB970C2F +:10D0A000FE7C1800E0A00262E0A0685E499C780C5B +:10D0B000E81C0017498B970700CB5B001302F1ECCB +:10D0C000560400D60000800100D700010000934202 +:10D0D000010D02F1EC56030000000100496B970CB2 +:10D0E000496B9707B3CC494B970C34CCEA1CAA0088 +:10D0F000492B970C492C780CE01CFFF0490B970C3E +:10D10000E0A06858E3CF9080FFFF156080019C6429 +:10D11000800148C4FFFF1458FFFF1408FFFF140CE0 +:10D12000FFFF14108001A778FFFF2C70FFFF2E7007 +:10D130008001A7ACFFFF1844FFFF1818FFFF184C31 +:10D140008001A7D4D401204D1A9CE06BCE94EA1B39 +:10D150008001B709B928B709B9281A9BFE7C440099 +:10D16000C4EF5C6C2FCDD802EBCD40C0201D1897CA +:10D17000348CE0A0629DE066D09CEA1680015C578A +:10D18000C0E0305CE0A06FE8304CE0A06FE56C0CD4 +:10D19000500C302B1A9CE0A063C3C0D8315CE0A0D7 +:10D1A0006FDB314CE0A06FD86C1C500C302B1A9CFC +:10D1B000E0A063B6348CE0A0629D2FFDE3CF80C079 +:10D1C000D401206DFACCFFF4E06BD03CEA1B800167 +:10D1D000B709B928170818A8C06F503C00E99A0091 +:10D1E0001302F1EC560400D70000800100D80001C2 +:10D1F000000004A9010D02F1EC560300000001003B +:10D20000E06C9E10EA1C8000500CE06CA4B0EA1C9C +:10D210008000501CE06C9DA4EA1C8000502C1A9ADF +:10D22000FACBFFF4FE7C4C00E0A066BA5C6C2FAD3C +:10D23000D802D7038001A59CEBCD4080202D306C17 +:10D24000E0A06F9C301B306CE0A068F8309CE0A040 +:10D250006F95301B309CE0A068F130BCE0A06F8E71 +:10D26000301B30BCE0A068EA30ECE0A06F87301BD8 +:10D2700030ECE0A068E3316CE0A06F80301B316CD3 +:10D28000E0A068DC325CE0A06F79301B325CE0A08B +:10D2900068D5329CE0A06F72301B329CE0A068CE53 +:10D2A00032BCE0A06F6B301B32BCE0A068C732CC50 +:10D2B000E0A06F64301B32CCE0A068C032DCE0A09C +:10D2C0006F5D301B32DCE0A068B932ECE0A06F5635 +:10D2D000301B32ECE0A068B230DCE0A06F4F300BC6 +:10D2E00030DCE0A068AB300CE0A06F48301B300CA5 +:10D2F000E0A068A4301CE0A06F41301B301CE0A00F +:10D300000046F1001302F1EC560400D80000800141 +:10D3100000D9000100004412010D02F1EC56030097 +:10D3200000000100689D302CE0A06F3A301B302CCB +:10D33000E0A06896303CE0A06F33301B303CE0A0AA +:10D34000688F307CE0A06F2C301B307CE0A06888B8 +:10D35000308CE0A06F25301B308CE0A06881320C4F +:10D36000E0A06F1E301B320CE0A0687A321CE0A0F7 +:10D370006F17301B321CE0A06873324CE0A06F10B6 +:10D38000300B324CE0A0686C311CE0A06F09300B10 +:10D39000311CE0A06865314CE0A06F02300B314CCD +:10D3A000E0A0685E315CE0A06EFB300B315CE0A079 +:10D3B0006857304CE0A06EF4300B304CE0A0685061 +:10D3C000305CE0A06EED300B305CE0A06849322CA0 +:10D3D000E0A06EE6301B322CE0A06842310CE0A0E9 +:10D3E0006EDF301B310CE0A0683B326CE0A06ED8E1 +:10D3F000300B326CE0A06834323CE0A06ED1303BA0 +:10D40000323CE0A0682D30FCE0A06ECA300B30FC4E +:10D41000E0A06826312CE0A06EC3300B312CE0A0D8 +:10D42000681F313C0043EF001302F1EC560400D9B1 +:10D430000000800100DA00010000D1D9010D02F1E5 +:10D44000EC56030000000100E0A06EBC300B313C44 +:10D45000E0A06818327CE0A06EB5300B327CE0A012 +:10D46000681132ACE0A06EAE300B32ACE0A0680ABE +:10D47000328CE0A06EA7300B328CE0A06803E0672E +:10D48000D074EA1780016E0C501C302BFACCFFFCD4 +:10D49000E0A0627C6E1C500C302B1A9CE0A06276DF +:10D4A0002FEDE3CF8080D7038001B7788001AA38C1 +:10D4B00080019F40EBCD40C03016FE771C00300944 +:10D4C000300A301BFE7C1C00E0A0671AC0C1300986 +:10D4D000300A300BFE7C1C00E0A06712C031E3CFA5 +:10D4E00080C03026CA4DCB5DC90D301AE06B0120DB +:10D4F000E06C4320EA1C8000E0A068C048BC780CC7 +:10D50000EDBC0018CFC36E0CA9AC8F0C487C780C16 +:10D51000EDBC0018CFC3E0A001E70C9C5C6CE3CD30 +:10D5200080C0D7038001A8B4FFFF1C08300BC0B82F +:10D53000FE6A0400F40B002A7409E019FFF8A1A99F +:10D5400095092FFB584BCF5300FBF9001302F1EC68 +:10D55000560400DA0000800100DB000100006E626A +:10D56000010D02F1EC56030000000100300BC0F881 +:10D57000FE6A0440F40B002A7409E419FFFCE27807 +:10D580000000F1EC0108104995092FFB584BCF130F +:10D590005EFD0000D401300CCDCF340CE0A060F271 +:10D5A000345CE0A060EF347CE0A060EC349CE0A050 +:10D5B00060E934ACE0A060E634CCE0A060E334EC99 +:10D5C000E0A060E0357CE0A060DD359CE0A060DAA2 +:10D5D000360CE0A060D7361CE0A060D4320CE0A08E +:10D5E00060D1322CE0A060CE324CE0A060CB340C95 +:10D5F000EA1CAA00489B970C300C487B970C310C16 +:10D60000EA1CAA00485B970CE06C0081FE7B1410BA +:10D61000970CD80AFFFF1440FFFF1458791B344AB7 +:10D62000EA1AAA00996AA5DBF94B00445EFD0000E6 +:10D63000D401E1BC0000FEB0FC5DD303E06B0160EF +:10D64000EA1BAA00FE7A1458950BE06B00C0484A0A +:10D65000950B5C5CC020D503D80AD703FFFF15608B +:10D66000EBCD4080301CE0674258EA170028B70035 +:10D670001302F1EC560400DB0000800100DC000125 +:10D6800000007A4A010D02F1EC560300000001008F +:10D690000000AE9C300BAEFBEF6B000DEF6B001388 +:10D6A000EF6B0019AEABEF6B0008EF6B000EEF6B8A +:10D6B0000014EF6B001AAECBEF6B000AEF6B00109B +:10D6C000EF6B0016EF6B001CAEDCEF6C000BEF6C29 +:10D6D0000011EF6C0017EF6C001DAE8C302CAEEC1F +:10D6E000303CEF6C000C304CEF6C0012305CEF6C97 +:10D6F0000018306B327CE0A0617D306B328CE0A092 +:10D700006179306B30FCE0A06175306B32ACE0A029 +:10D710006171306B312CE0A0616D305A0E9BFE7C44 +:10D720002400E0A05C85E3CF8080D70380019F6068 +:10D730008001959CD4211895169714960A942FF47D +:10D740005C64346CE0A0600EEA0C1518C261EC0C4D +:10D750001518C081300CE06B4258EA1B0000B6BCC3 +:10D76000C0985816C071301CE06B4258EA1B00008C +:10D77000B6BCE06C4258EA1C0000301B198AF60A5D +:10D78000094B19BC581C4ADC780CC031184BC03806 +:10D7900000AF14001302F1EC560400DC000080011D +:10D7A00000DD0001000010F2010D02F1EC56030053 +:10D7B00000000100168C189B4A9C990B5C57C3A073 +:10D7C000089BFE7C2400E0A05CA75815C101301A1C +:10D7D000E06B0161E06C42FCEA1C8000E0A0678421 +:10D7E000089BFE7C2400E0A05CA3C358EA0C15183B +:10D7F000C101301AE06B0160E06C4314EA1C800048 +:10D80000E0A06772089BFE7C2400E0A05C91C23817 +:10D810005845C211301AE06B0180E06C4308EA1CE5 +:10D820008000E0A06761089BFE7C2400E0A05C8093 +:10D83000C1285815C060EA0C1518C0305845C061A1 +:10D84000089BFE7C2400E0A05C79089BFE7C240001 +:10D85000E0A05C68346CE0A05FB9D82AFFFF241C0C +:10D86000800196608001AC308001967880019684BA +:10D870008001966CFE7C1C08780BEDBB0018CFB3C2 +:10D88000485B760BA9AB484A950B780BEDBB0018AB +:10D89000CFD35EFDFFFF1C10FE7C1C08780BEDBB98 +:10D8A0000018CFB3485B760BA9AB484A950B780BB1 +:10D8B000EDBB00180077EF001302F1EC560400DD19 +:10D8C0000000800100DE000100008539010D02F139 +:10D8D000EC56030000000100CFD35EFDFFFF1C1CCF +:10D8E000FE7C1C08780BEDBB0018CFB3485B760BB1 +:10D8F000A9AB484A950B780BEDBB0018CFD35EFD62 +:10D90000FFFF1C0CEBCD4080581BC0D1E0A01F6C6A +:10D91000E06B126FEA1B4183E0A01D9CE0A01F3E5C +:10D92000189BC0A8E0A01F60FC1B4266E0A01D92EF +:10D93000E0A01F34189B4A0C780CEDBC0018CFC334 +:10D94000FE7C1C00E0A0655E49BC780CEDBC0018B4 +:10D95000CFC3300BFE7C1C00E0A06546E3CF808087 +:10D9600080011D0C8001197880011CC08001A9284C +:10D970008001A90C490C780CEDBC0018CFC3FE7CCB +:10D980001C00780BA1CB990B48BC780CEDBC00189F +:10D99000CFC35EFD488C780CEDBC0018CFC3FE7C75 +:10D9A0001C00780BA1AB990B483C780CEDBC00181F +:10D9B000CFC35EFDFFFF1C08300CFE7B1C00760B06 +:10D9C000EDBB0000C022301C5C5C5EFCD401340C5A +:10D9D000FE6B0000970CE0A0006F11001302F1EC49 +:10D9E000560400DE0000800100DF000100003A82E2 +:10D9F000010D02F1EC5603000000010050DBDA0AD1 +:10DA0000800180B4D401205D343CE0A05EE1301C94 +:10DA1000FEB0FABEE06904C4301A301B1A9CFEB096 +:10DA2000FB2D301CFEB0FB02300B1A9CE0A046160A +:10DA3000302A302B302CE0A05077300CFEB0FB4267 +:10DA4000302CE0A050A1303CFEB0FABA343CE0A04B +:10DA50005EE12FBDDA0AD70380019CD080016B5CA8 +:10DA6000800180288001808880019D14D421201DA0 +:10DA7000189616973005E0A06D651894E91B0066AE +:10DA8000301CF806094C184BE95B0066E91C00667F +:10DA9000500CE06CCFACEA1C8001FEB0C825587673 +:10DAA000C071E06C37B0EA1C000028BCB88729A41C +:10DAB000888C581CC02530150A9C5C5C2FFDD82230 +:10DAC000D42118943006FEB0C6F31895E06CD0D47B +:10DAD000EA1C8001FEB0C8083007C0282FF75C6739 +:10DAE00058A7E0840102E91C0066F8070A4CA19CD3 +:10DAF000CF620E9C5C5C58ACF9BC020A0079400015 +:10DB00001302F1EC560400DF0000800100E0000188 +:10DB10000000A5E9010D02F1EC5603000000010030 +:10DB20002FECFE0C001FC0B8C1D8C368C4D8C618FB +:10DB3000C738C878C9C8CB78CCD8CDE8E06C3828CD +:10DB4000EA1C00007809E06C37B0EA1C0000189B62 +:10DB50002F6B300AB68A2F6C72BB767B5D1B1896D2 +:10DB6000CCB8E06C3828EA1C00007819E06C37B0BB +:10DB7000EA1C0000300BF96B000B189B2F5B300880 +:10DB8000169E322A1CC8201ACFE12F5C72BB767B0E +:10DB90005D1B1896CB18E06C3828EA1C0000782929 +:10DBA000E06C37B0EA1C0000189B2D3B300AB68AA7 +:10DBB000B69AB6AAB6BAB6CAB6DA2D3C72BB767BAE +:10DBC0005D1B1896C998E06C3828EA1C000078297B +:10DBD000E06C37B0EA1C0000189B2CDB300AB68AD8 +:10DBE0002D3C189B304C72B972895D191896C84843 +:10DBF000E06C3828EA1C00007839E06C37B0EA1C89 +:10DC00000000189B2CCB300AB68A2CCC72BB767BDA +:10DC10005D1B1896C718E06C37B0EA1C00006A0B51 +:10DC2000006D0D001302F1EC560400E000008001CD +:10DC300000E1000100001958010D02F1EC5603004B +:10DC400000000100F96B00356A3BF96B00366A5B36 +:10DC5000F96B00376A6BF96B0038301B2C7CB88B82 +:10DC60003016C5C8E06C3828EA1C00007819E06C52 +:10DC700037B0EA1C0000189B2C6B300AB68A301BA8 +:10DC8000F96B003A2C6C72BB767B5D1B1896C468EE +:10DC9000E06C3828EA1C00007819E06C37B0EA1C08 +:10DCA0000000189B2C5B300AB68A301BF93A0075CD +:10DCB0002FCAF60A094BA1BBF96B003B2C5C72BB67 +:10DCC000767B5D1B1896C2A8E06C37B0EA1C00009A +:10DCD0002C4C300A300BB91BF8EB0008F8EB0010A5 +:10DCE000F8EB0018F8EB0020F8EB0028F8EB003018 +:10DCF000C22C1896C138E06C3828EA1C00007869FC +:10DD0000E06C37B0EA1C0000189B28CB300AB68ABA +:10DD100028CC72BB767B5D1B1896F5D6C008F7D76A +:10DD2000B008E06C37B0EA1C0000E0A0030D0C9CCA +:10DD30005C5CD822D431208D300CBACCE060CE802F +:10DD4000EA1080010033E4001302F1EC560400E114 +:10DD50000000800100E2000100008C93010D02F13F +:10DD6000EC56030000000100A10AFAEB000830079E +:10DD7000FEB0C5D418963005C2C8169AA17AFAC961 +:10DD8000FFF814091388A96813991009FAC8FFF05D +:10DD9000F00A0A095C89F20A14082C4CB88A2FF799 +:10DDA0005C67E807000C2C4CB8892FF72FFB5C6BE5 +:10DDB000089C5C670E0C582BCE15300B2C4CB88B86 +:10DDC0002FF766BC782C5D1CE081019D2FF55C650A +:10DDD0005885E084023CE06437B0EA1400005C67D8 +:10DDE000E807000C2C4CB8852FF7E0613828EA11C1 +:10DDF0000000E20503230A9C588CF9BC0208FE0CC3 +:10DE0000001C984C180F001400AC013801C402B279 +:10DE100003040410039AFFC866BC781C5D1CCD7017 +:10DE2000E06B02BC0C9CFEB0C87D306BFACCFFF8F6 +:10DE300066BA745A5D1ACCB0300BC178F60A150177 +:10DE4000FACCFFF8140C1999A969198C1809E06C1F +:10DE500006A0EA1C0000140C980C1809FACCFFF07C +:10DE6000F80A0A092FFB5C6B006A43001302F1EC0D +:10DE7000560400E20000800100E3000100003328A6 +:10DE8000010D02F1EC56030000000100583BCE9555 +:10DE9000FACBFFF0300CCF3D300BC158FACCFFF07D +:10DEA000F80B041CF80A14085C67E80700092C4901 +:10DEB000B28A2FF75C67E807000A2C4AB48C2FF768 +:10DEC0002FFB5C6B583BCEB566BC782C5D1CC91132 +:10DED000300CCCF966BC781C5D1CC8B0E06B03202C +:10DEE0000C9CFEB0C831306BFACCFFF866BA745A9D +:10DEF0005D1AFE90FF7F300BC108F60A1501FACCBF +:10DF0000FFF8140C1999A969198C1809FACCFFF0BB +:10DF1000F80A0A092FFB5C6B583BCF05FACBFFF0E0 +:10DF2000301CCADD300BC158FACCFFF0F80B041CD2 +:10DF3000F80A14085C67E80700092C49B28A2FF731 +:10DF40005C67E807000A2C4AB48C2FF72FFB5C6B48 +:10DF5000583BCEB566BC782C5D1CFE91FF4BCB9B2D +:10DF600066BC781C5D1CFE90FF45332B0C9CFEB0FC +:10DF7000C7EB306BFACCFFF866BA745A5D1AFE90A4 +:10DF8000FF39300BC108F60A1501FACC005FC30057 +:10DF90001302F1EC560400E30000800100E40001EC +:10DFA00000002700010D02F1EC5603000000010003 +:10DFB000FFF8140C1999A969198C1809FACCFFF00B +:10DFC000F80A0A092FFB5C6B583BCF05FACBFFF030 +:10DFD000302CC67D300BC158FACCFFF0F80B041C76 +:10DFE000F80A14085C67E80700092C49B28A2FF781 +:10DFF0005C67E807000A2C4AB48C2FF72FFB5C6B98 +:10E00000583BCEB566BC782C5D1CFE91FF05C73B26 +:10E0100066BC781C5D1CFE90FEFF33CB0C9CFEB0F2 +:10E02000C7A53002C188300C66BB764B5D1B314BF7 +:10E030000C9CFEB0C79B301C66BB764B5D1B314B06 +:10E040000C9CFEB0C793306BFACCFFF866BA745ADA +:10E050005D1A2FF25832CE85300BC0D8582BC091A4 +:10E06000FB3A000BA96AFB3C000C180AFB5A00148F +:10E070002FFB5C6B583BC134580BC0A1FB3A000826 +:10E08000A96AFB3C0009180AFB5A0010CF2B581B49 +:10E09000CE61FB3C000AFB5C0012CEBBFB0B001008 +:10E0A000A96BFB0C0012160CF80B14105C67E80748 +:10E0B000009115001302F1EC560400E40000800109 +:10E0C00000E5000100004DB8010D02F1EC5603001F +:10E0D00000000100000A2C4AB48B2FF7F80B14083B +:10E0E0005C67E807000A2C4AB48B2FF75C67E807E7 +:10E0F000000B2C4BB68C2FF7FB0C0014F80B1408FC +:10E100005C67E807000A2C4AB48B2FF75C670E04A3 +:10E110002C44A88C2FF766BC782C5D1CFE91FE8EDB +:10E12000CFCA66BC781C5D1CFE90FE8833CB0C9C6D +:10E13000FEB0C72E306BFACCFFF866BA745A5D1A7F +:10E14000FE90FE7C300BC0D8FACCFFF8160C198C70 +:10E150005C67E807000A2C4AB48C2FF72FFB5C6B36 +:10E16000584BCF3566BC782C5D1CFE90FE67301C8A +:10E17000BACCC63A300CBADC300266BC781C5D1CE6 +:10E18000FE90FE5C301BFACCFFFB625A74BA746AD4 +:10E190005D1AE06B00960C9CFEB0C6FA3001C028F8 +:10E1A0002FF158A1C164306BFACCFFF866BA745AEB +:10E1B0005D1A314B0C9CFEB0C6EBFB3C0008500CCA +:10E1C000009C2F8CFEB0C4FCFB3200085862CE9439 +:10E1D000E0A06A2400DEB5001302F1EC560400E56D +:10E1E0000000800100E600010000D873010D02F17B +:10E1F000EC560300000001005C67E807000BF93CE7 +:10E200000082043CC064301C2C4BB68C2FF7C058E5 +:10E21000300C2C4BB68C2FF75C670E042C44A88274 +:10E220002FF766BC782C5D1CFE91FE1AC88A66BC6E +:10E23000781C5D1CFE90FE14E06B02580C9CFEB036 +:10E24000C6B9306BFACCFFF866BA745A5D1AFE9004 +:10E25000FE07300BC1F8F60C1501FACAFFF8180AD0 +:10E260001589A969159A120AFAC9FFF0F20C0A0A6F +:10E270005C8AF40C14085C67E80700092C49B28C2E +:10E280002FF75C67E807000C2C4CB88A2FF72FFBA0 +:10E290005C6B584BCE1566BC782C5D1CFE91FF7BE9 +:10E2A000FE9FFDDE66BC781C5D1CFE90FDD9300C27 +:10E2B00066BB764B5D1B301CE76C000F33CB0C9CB0 +:10E2C000FEB0C678306BFACCFFF866BA745A5D1AA5 +:10E2D000FE90FDC6300BFE9FFDB51BCC2F8DD832B6 +:10E2E00080006DB0800073B8EBCD40C0202D189633 +:10E2F0001697E0A069A5E06B00F805001302F1ECA9 +:10E30000560400E60000800100E70001000067C835 +:10E31000010D02F1EC56030000000100D0E4EA1BFD +:10E320008001B70ABB1B300B5806C031E06BFFFF02 +:10E33000180628260D8C588CF9BC02001E0C19EC0E +:10E34000180F0A18283A4A5C6C7E8E0CBA0C8E1C88 +:10E35000BA1C8E2CBA2CC3D88E1CBA0C8E0C181B6F +:10E36000BA1B8E2CBA2CC3588E0C162CBA0C8E1CD1 +:10E37000181BBA1B8E2CBA2CC2C88E1C181BBA0BC9 +:10E380008E0CBA1C8E2CBA2CC2488E0C162CBA0CD1 +:10E390008E1CBA1C8E2C181BBA2BC1B88E1CBA0C42 +:10E3A0008E0CBA1C8E2C181BBA2BC1388E0CBA0CD2 +:10E3B0008E1C162CBA1C8E2C181BBA2BC0A88E1CB7 +:10E3C000162CBA0C8E0C162CBA1C8E2C181BBA2BC1 +:10E3D0009A0CAE0C9A1CAE1C9A2CAE2C2FEDE3CFEF +:10E3E00080C00000EBCD40803007E06CD0ECEA1C30 +:10E3F0008001FEB0C409300CC0B8E06B37B0EA1B36 +:10E400000000F60C060A580AC02030172FFC5C6C7E +:10E4100058ACCF450E9C5C6CE3CD808000E4C1001D +:10E420001302F1EC560400E70000800100E800014F +:10E430000000F023010D02F1EC5603000000010082 +:10E44000F80B0B0A5EFD0000D401E06CD054EA1C0E +:10E450008001FEB0C3EB300CC098300BE06A37B0DF +:10E46000EA1A0000F40C0B0B2FFC5C6C58ACCF6567 +:10E47000D80A0000EBCD40E018961697E0A069049A +:10E480001895E06CD0FCEA1C8001FEB0C3CF300CC4 +:10E49000C0382FFC5C6C58ACE08400BE301BF60C1E +:10E4A000094BEB1A0066166ACF50302A0F89F20921 +:10E4B0001068EC090B0A0F8AF40A10680C0AB4AC55 +:10E4C00058ACF9BC020A1E0CF93C000AFE0C001FF5 +:10E4D000081526374451626F7C8D9900E06A37B089 +:10E4E000EA1A00002F6A0F8CF80C106818062FC665 +:10E4F000158CAC8CC858E06937B0EA1900002F5968 +:10E500000F8CF80C106818062FC60C98322A133C92 +:10E5100010CC201ACFD1C748E06937B0EA19000003 +:10E520002D390F8CF80C106818062FC60C98306A1D +:10E53000133C10CC201ACFD1C638E06A37B0EA1AA3 +:10E5400000B189001302F1EC560400E800008001DC +:10E5500000E900010000B098010D02F1EC56030043 +:10E560000000010000002CDA0F8CF80C106818066F +:10E570002FC6158CAC8CC568E06A37B0EA1A00006B +:10E580002CCA0F8CF80C106818062FC6158CAC8C92 +:10E59000C498E06937B0EA1900002CB90F8CF80C68 +:10E5A000106818062FC60C98305A133C10CC201A4D +:10E5B000CFD1C388E06A37B0EA1A00002C6A0F8C0A +:10E5C000F80C106818062FC6158CAC8CC2B8E06A1F +:10E5D00037B0EA1A00002C5A0F8CF80C1068180695 +:10E5E0002FC6158CAC8CC1E8E06937B0EA19000081 +:10E5F0002C490F8CF80C106818062FC60C98338A1B +:10E60000133C10CC201ACFD1C0D8E06A37B0EA1A38 +:10E61000000028CA0F8CF80C106818062FC6158C3D +:10E62000AC8C0F8C2FFCAE8CEB1C0066168CEB5C5C +:10E630000066300C29A5AA0C300CE06B37B0EA1B41 +:10E64000000028BBB68CE3CF80E0D7038001BA443A +:10E6500080006FE8EBCD40C0201DE06CD140EA1C8B +:10E660008001FACB001FA0001302F1EC560400E970 +:10E670000000800100EA000100002553010D02F1B5 +:10E68000EC56030000000100FFFF198AB68A199AB0 +:10E69000B69A19ACBA8C3006C0382FF65C56E067D3 +:10E6A000008C58A6C184E06C0040EA1C0000F8060B +:10E6B000000B2F4B178BBA9B0C0C198CBAAC302962 +:10E6C000FACAFFFFF7D7C008304CFEB0C325CE61B1 +:10E6D000300CC1B830181A99305AF7D7C008304CEE +:10E6E000FEB0C346CF601B8CA7BCBA8C305CBA9C12 +:10E6F0001B8CBAAC3029FACAFFFFF7D7C008304CE0 +:10E70000FEB0C30ACE60301C2FFDE3CD80C00000F8 +:10E71000EBCD40C0201DE06CD0A4EA1C8001FACBF8 +:10E72000FFFF198AB68A199AB69A19ABBA8B2FCC01 +:10E73000FEB0C2A0305CBA9CE06C0080BAACE0676E +:10E74000008C3029FACAFFFFF7D7C008304CFEB062 +:10E75000C2E3C031300CC3B8322CFEB0C50F300656 +:10E76000C1E85836C1A05846C1805856C160E06C17 +:10E770000040EA1C0000F806000B2F4B178BBA9BD9 +:10E780000C0C198CBAAC302900D015001302F1EC36 +:10E79000560400EA0000800100EB000100009AE846 +:10E7A000010D02F1EC56030000000100FACAFFFF60 +:10E7B000F7D7C008304CFEB0C2C1CDF02FF65C5682 +:10E7C00058A6CE2530181A99305AF7D7C008304CC1 +:10E7D000FEB0C2E0CD201B8CF9DCC007BA8C30192A +:10E7E0001A9AF7D7C008304CFEB0C2A8CC60301CD3 +:10E7F0002FFDE3CD80C00000EBCD4080201DE06CFC +:10E80000D0ACEA1C8001FACBFFFF198AB68A199AAC +:10E81000B69A19ABBA8B2FCCFEB0C23EE067008C23 +:10E8200030181A99305AF7D7C008304CFEB0C2B22F +:10E83000C031300CC1B81B8CA7BCBA8C305CBA9C00 +:10E840001B8CBAAC3029FACAFFFFF7D7C008304C8E +:10E85000FEB0C274CEF0E0A0674DF93C0084580CC5 +:10E86000C041322CFEB0C4AC301C2FFDE3CD808003 +:10E87000EBCD4080201DE06CD12BEA1C8001FACB4F +:10E88000FFFF198AB68A199AB69A19ACBA8CE06752 +:10E89000008C30181A99305AF7D7C008304CFEB0A7 +:10E8A000C279C031300CC1B81B8CA7BC004CD10060 +:10E8B0001302F1EC560400EB0000800100EC0001B3 +:10E8C00000008EC0010D02F1EC56030000000100B3 +:10E8D000BA8C305CBA9C1B8CBAAC3029FACAFFFFE8 +:10E8E000F7D7C008304CFEB0C23BCEF0E0A06714B2 +:10E8F000F93C0084580CC041322CFEB0C473301C6B +:10E900002FFDE3CD80800000EBCD4080201D1897C7 +:10E91000E06CD120EA1C8001780C500C30480E9934 +:10E92000301AE06B008C304CFEB0C246C031300C67 +:10E93000C1A80E9CC1ECFEB0C0A5793C581CC121F9 +:10E940001A9C0F8BB88B0F9BB89B0FABB8AB0FBB50 +:10E95000B8BB1B9CAE8C1B8CAE9C1BBCAEAC1BAC6A +:10E96000AEBC301C2FFDE3CD8080D70380006DB09E +:10E97000EBCD40E0201DE067CFB8EA1780011A9B7D +:10E980000F8AB68A0F9AB69A300AC09830089398C0 +:10E9900072995839C035301997E92FFAE06B004069 +:10E9A000EA1B0000584AC1341699F20A0029F80AF5 +:10E9B00007085808CEC172982FF893987298E058BB +:10E9C00086A1CE75E07886A09398CE3B76EC580C65 +:10E9D000001239001302F1EC560400EC0000800133 +:10E9E00000ED00010000E478010D02F1EC56030097 +:10E9F00000000100C43076DC580CC401301C97DCE8 +:10EA0000E06600FFBA86354CBA9CE065008C302980 +:10EA10001A9AF7D5C008304CFEB0C1B4BA8634DCBF +:10EA2000BA9C30291A9AF7D5C008304CFEB0C1AA5A +:10EA3000345CBA8C305CBA9C30291A9AF7D5C0087D +:10EA4000304CFEB0C19F344CBA8C340CBA9C302987 +:10EA50001A9AF7D5C008304CFEB0C194345CBA8C19 +:10EA6000300CBA9C30291A9AF7D5C008304CFEB049 +:10EA7000C1892FC70E9CFEB0C1332FFDE3CF80E0CC +:10EA8000D401201D198BE06A0040EA1A0000B4ABE3 +:10EA9000198C500CE06CD000EA1C8001FEB0C12043 +:10EAA0002FFDDA0AD401585CC051169CCEAFC021AC +:10EAB000D80ADA0AD401E06BCC58EA1B8001304C4A +:10EAC000E0A04FC0D80A0000EBCD40E0201DE06C74 +:10EAD000D12EEA1C8001FACBFFFF198AB68A199A57 +:10EAE000B69A19ACBA8CE0A0662918973005C038E0 +:10EAF0002FF55C5500F80B001302F1EC560400ED05 +:10EB00000000800100EE0001000071B3010D02F170 +:10EB1000EC56030000000100E066008C58A5C174AB +:10EB2000E06C0040EA1C00000A0CF93B000CBA9BA8 +:10EB30002E8C198CBAAC3029FACAFFFFF7D6C00860 +:10EB4000305CFEB0C131CE71300CC41830181A9947 +:10EB5000305AF7D6C008305CFEB0C152CF601B8C73 +:10EB6000A1ACBA8C305CBA9C1B8CBAAC3029FACA06 +:10EB7000FFFFF7D6C008305CFEB0C116CE6030187B +:10EB8000FAC9FFFF300AF7D6C008305CFEB0C138C2 +:10EB9000CDC01B8CA7BCBA8C305CBA9C1B8CBAACA9 +:10EBA0003029FACAFFFFF7D6C008305CFEB0C0FCBF +:10EBB000CCC0300A300B300CFEB0C3D4EF3C008424 +:10EBC000580CC041322CFEB0C331301C2FFDE3CDB8 +:10EBD00080E00000D421202DE066CCE4EA1680011C +:10EBE000FACCFFFC0D8BB88B0D9BB89B0DACBAEC2F +:10EBF0000C9C2FCCFEB0C086322CFEB0C307300573 +:10EC0000C0382FF55C5558A5C1D45865CFB058759C +:10EC1000CF905885CF70E06700E9FF001302F1EC58 +:10EC2000560400EE0000800100EF00010000CE0855 +:10EC3000010D02F1EC560300000001000040EA174C +:10EC400000000A07EF3C000CBACC2E870F8CBADC10 +:10EC50003029FACAFFFCE06B008C305CFEB0C0B615 +:10EC6000CE31300CC988E0670040EA1700006EDC46 +:10EC7000500C0C9C2F8CFEB0C057E065008C6EDCF5 +:10EC8000581CC461E06400FFBAC4354CBADC3029BA +:10EC9000FACAFFFCF7D5C008304CFEB0C097CE20B2 +:10ECA000BAC434DCBADC3029FACAFFFCF7D5C00894 +:10ECB000304CFEB0C08BCD60345CBACC305CBADC7A +:10ECC0003029FACAFFFCF7D5C008304CFEB0C07E30 +:10ECD000CC90344CBACC3004BAD43029FACAFFFCF8 +:10ECE000F7D5C008304CFEB0C071CBC0345CBACC94 +:10ECF000BAD43029FACAFFFCF7D5C008304CFEB0B0 +:10ED0000C065CB002EC60C9CFEB0C00E8FD4301850 +:10ED1000FAC9FFFA305AF7D5C008305CFEB0C0829D +:10ED2000CA101BECF9DCC007BAEC3019FACAFFFABA +:10ED3000F7D5C008305CFEB0C049C94000222000B1 +:10ED40001302F1EC560400EF0000800100F0000116 +:10ED50000000DE60010D02F1EC560300000001002E +:10ED60003018FAC9FFFA305AF7D5C008305CFEB047 +:10ED7000C06BC8A01BECA1ACBAEC305CBACC1BECED +:10ED8000BADC3029FACAFFFCF7D5C008305CFEB007 +:10ED9000C02FFE90FF7A3018FAC9FFFA300AF7D573 +:10EDA000C008305CFEB0C050FE90FF6F300A301BD0 +:10EDB000300CFEB0C2FB301C2FEDD822800074F066 +:10EDC000EBCD4080201DE06CD07CEA1C8001FACBAA +:10EDD000FFFF198AB68A199AB69A19ABBA8B2FCC4B +:10EDE000FEB0BFB4E067008C30181A99305AF7D7DC +:10EDF000C008305CFEB0C028C031300CC2081B8C8B +:10EE0000A7BCBA8C305CBA9C1B8CBAAC3029FACA4D +:10EE1000FFFFF7D7C008305CFEB0BFEACEF0300A83 +:10EE2000300B300CFEB0C2C2E0A064BEF93C0084DE +:10EE3000580CC041322CFEB0C21D301C2FFDE3CD5A +:10EE40008080D70380006FE88000764880007510CE +:10EE5000EBCD4080201DE06CD13DEA1C8001FACB57 +:10EE600000979D001302F1EC560400F000008001B1 +:10EE700000F100010000CADD010D02F1EC560300B3 +:10EE800000000100FFFF198AB68A199AB69A19ACD8 +:10EE9000BA8CE067008C30181A99305AF7D7C0083E +:10EEA000305CFEB0BFE3C031300CC1481B8CA7BC46 +:10EEB000BA8C305CBA9C1BAB1B8C184BBAAB30299C +:10EEC000FACAFFFFF7D7C008305CFEB0BFA3CED0B0 +:10EED000301C2FFDE3CD8080EBCD40C01897E0665D +:10EEE00008F6EA16000030180C99304AE06B008CE6 +:10EEF000305CFEB0BFBBC031E3CF80C00D8CE06B97 +:10EF000008F7EA1B0000B68CAE8CE3CF90C0D703A5 +:10EF1000800070E4EBCD4080201D1A9C300BB88B34 +:10EF2000B89BE0A06453308BBA8BF93C0082BA9C4A +:10EF3000E067008C30291A9AF7D7C008305CFEB021 +:10EF4000BF69C031300CC0E8309CBA8C300CBA9C20 +:10EF500030291A9AF7D7C008305CFEB0BF5BCF30BB +:10EF6000301C2FFDE3CD80808001BA448000708C7E +:10EF7000EBCD4080E067CC7CEA1780010E9B305CD3 +:10EF8000E0A04DA800C98B001302F1EC560400F17B +:10EF90000000800100F2000100005F16010D02F187 +:10EFA000EC560300000001000E9B308CE0A04DA445 +:10EFB000E3CF808080018D4CD431202D1897E065FF +:10EFC0000F98EA1500008ACC160CAA4C8ADC160CA5 +:10EFD000AA5C0BEC599CC0940BEC2FFCAAEC0E9C89 +:10EFE000E0A0240EEAEB013C3016EA1643FA0E9C30 +:10EFF0000C9BE0A01519E0830131EAF401F4089CB0 +:10F000000C9BE0A01511E08301290BEC599CE085D5 +:10F0100001258ACCE04C00AFE08501200E9C089BC6 +:10F02000E0A012BCE0640080EA140000892CEB47E9 +:10F0300001F4E0A023E5BFDBE068999BEA18999909 +:10F04000E0699999EA193FC9E0A023F8C063EAEAA8 +:10F05000013CE0A0149F18970B9C580CC061EB4733 +:10F0600001F8EB4701FCC4A86806FC133FF00E9CB6 +:10F07000E0A023C6149016910C9CE0A023C1149824 +:10F080001699300A069BE0A021E900980299E0A0B9 +:10F09000232E14901691EAFC01F80C9BE0A0134279 +:10F0A000E0A023AE00980299005C2D001302F1EC61 +:10F0B000560400F20000800100F300010000E0AD02 +:10F0C000010D02F1EC56030000000100E0A0220C4B +:10F0D000E0A01472EB4C01F86816E0A023A3149092 +:10F0E00016910C9CE0A0239E14981699300A069B5A +:10F0F000E0A021C600980299E0A0230B1492169379 +:10F10000EAFC01FC0C9BE0A0131FE0A0238B0498F9 +:10F110000699E0A021E9E0A0144FEB4C01FC8ADC49 +:10F12000E04C03E9C185EAFC01FC0BABEA0B002BC8 +:10F13000F74C01540BAC2FFCAAAC0BAC594CC031B2 +:10F14000300CAAAC0BBC594CC0440BBC2FFCAABC65 +:10F15000300CAA5C0B860C90EA0000210B9C594CE9 +:10F16000C2716374089CE0A0235D14981699EAEAC2 +:10F170000124E0A02185EAEB0124089C089BE0A083 +:10F1800012E3E0A0234F14981699EAEA012CE0A0BC +:10F190002177EAEB012CE2FC00D4E0A02343149891 +:10F1A0001699EAEA0134E0A0216BEAEB0134E34767 +:10F1B000005C0E9CE0A02336EAE80124E0A0219444 +:10F1C000EAEB01240E9C0E9BE0A012BE00F8DD00CD +:10F1D0001302F1EC560400F30000800100F400017A +:10F1E0000000F485010D02F1EC560300000001005F +:10F1F000E0A0232AEAE8012CE0A0218814921693CB +:10F20000EAE3012CF5D6C0080B9B0A9C2A4CC99D49 +:10F21000E34C00D4E0A02318EAE80134E0A0217612 +:10F2200014961697EAE70134EAFC01FC833C8ACC89 +:10F23000EA00001BF75C00AC0B9C594CC0440B9CD3 +:10F240002FFCAA9C0B9CE0A0237114901691EAEA73 +:10F25000012400980299E0A022ABEAEB013C14984B +:10F260001699E0A02268BB1B049A069B009802999D +:10F27000E0A0229EBB08E0A02115EAEB01440C9A15 +:10F280000E9B00980299E0A02293EAEB014C0B8CB4 +:10F290002FFCAA8C300C0B8B594BC021AA8CAA4C8A +:10F2A0002FEDD83A800136B0D631202D300330070B +:10F2B000300C501C3005500CE0660F98EA16000028 +:10F2C0000D925942E08101300DBC585CE085012C63 +:10F2D000403C301BE0A013CCE0830126ECE001446D +:10F2E000E068999AEA189999E0699999EA193FA909 +:10F2F000009DD6001302F1EC560400F400008001DA +:10F3000000F5000100009E3D010D02F1EC560300E6 +:10F3100000000100009A029BE0A022C8C062E064E5 +:10F32000126FEA143B03C248E068999AEA18999967 +:10F33000E0699999EA193FA9009A029BE0A022B4DA +:10F34000C133009A029BE0686666EA186666E06967 +:10F350006666EA193FE6E0A022A9C062E0649BA6C7 +:10F36000EA143B44C058E064CCCDEA143DCC0DAB6C +:10F37000169C201C580CC0242ECC204B580BC024AB +:10F380002ECBEC0C002CF8FC0154EC0B002BF6FB04 +:10F390000154E0A01139E0A02269BFDBE0A01330E6 +:10F3A000E06BC290EA1B3CF5E0A01374C143ECEAA9 +:10F3B000014CBFDB14901691089CE0A022570098E6 +:10F3C0000299E0A02273C072F7D2C0080D8C201CF5 +:10F3D000C3CD18935C535813E08500B3300BC0883D +:10F3E000EC0B001CF91C00AC18075C772FFB5C7B56 +:10F3F000594BCF75403CE0A02239E0689204EA18EE +:10F400006FB0E0691127EA193F91E0A021A6E0A0C2 +:10F4100012F71894009F3A001302F1EC560400F51D +:10F420000000800100F6000100000BF6010D02F162 +:10F43000EC560300000001005C770E9CE0A0229ACD +:10F44000E068A9FCEA18D2F1E069624DEA193F5080 +:10F45000E0A02195E0A012E6089BE0A011AB189473 +:10F460000D8A149C201C580CC0242ECC0D9B142BF0 +:10F47000580BC0242ECBEC0C002C783CEC0B002B52 +:10F48000763BE0A010D3FC1BBF80E0A01193E0A06E +:10F4900021FFE0681EB8EA18EB85E069B851EA1967 +:10F4A0003FBEE0A021A9E0A012BD1897089BE0A0F4 +:10F4B0001303C0333007C1480E9C0E9BE0A0117AA5 +:10F4C0001893089C089BE0A01175069BE0A010AE65 +:10F4D000E0A021DEE0A0535CE0A012A4501C401B81 +:10F4E0000E9CE0A011DB0DCBEC0B002BF74C01A424 +:10F4F0000DCC2FFCACCC0DCC594CC031300CACCC6D +:10F500000DDC594CC0440DDC2FFCACDC3007C0B81E +:10F510005C77EC07002CF8FC01A40A9BE0A010F437 +:10F5200018952FF70DDCF8071900CF33E0A0130C66 +:10F530001897FC1C41200A9B003600001302F1ECD6 +:10F54000560400F60000800100F700010000B44DF1 +:10F55000010D02F1EC56030000000100E0A0113C97 +:10F560000E9BE0A011ADE0A021A5E068999AEA18F1 +:10F570009999E0699999EA193FB9E0A02112E0A0B0 +:10F580001263500CC048300CACCCACDC400CC02832 +:10F59000300C2FEDDC32D70380013A9080013A9491 +:10F5A00080013B3880019D5480013942D53118904B +:10F5B000149230043005300130063007C2685943D8 +:10F5C000C02521430E9CE0A012E7089BE0A010AEEE +:10F5D0001894E0030023660C0A9BE0A010A718957E +:10F5E0000E9CE0A012D9660BE0A010F6029BE0A0F2 +:10F5F000109D1891EE07024CE0A012CE0C9BE0A0EB +:10F60000109518962FF75C571BFC1837C0941BF306 +:10F6100004230E032FF35803CD342EC3CD4B089C87 +:10F62000089BE0A010D918971BFCE0A0129F0C9B30 +:10F63000E0A010D20E9BE0A0100BE0A0213BE06800 +:10F64000ED8DEA18A0B5E069C6F7EA193EB0E0A072 +:10F650001F9314961697089C0A9BE0A000EDB70034 +:10F660001302F1EC560400F70000800100F80001DD +:10F67000000023A6010D02F1EC560300000001007A +:10F6800010BD18951BFCE0A01283029BE0A010B6F1 +:10F690000A9BE0A00FEFE0A0211F0C980E99E0A0BC +:10F6A00020CFE0A011E3D93280011D388001371846 +:10F6B000800139BCEBCD40FE1894169330075804F6 +:10F6C000C0342EC4C0485944C025214430063005FA +:10F6D0003002C0C8E06B126FEA1B3B03029CE0A043 +:10F6E000120FC0332FF55C752FF2E803010B5C524B +:10F6F000069C201C1832C264040B2FFB580BC0342C +:10F700002ECBC048594BC025214B169C2FFC594C81 +:10F71000C025214CE06A0F98EA1A0000F40C002C76 +:10F72000783CF40B002A743BE0A00FA41891E06B26 +:10F73000126EEA1BBB03E0A011EFCCD22FF65C7671 +:10F74000CD4B2FFB580BC0242ECBE06A0F98EA1A42 +:10F750000000F404002C783CF40B002A743BE0A079 +:10F760000F89E0A020B9BFDBE0A0118018945C7580 +:10F7700058B5C125E06BC290EA1B3D75E0A011C0F1 +:10F780000031E0001302F1EC560400F800008001A3 +:10F7900000F900010000631D010D02F1EC560300A9 +:10F7A00000000100C0B3E06BCCCDEA1B3ECC089C4E +:10F7B000E0A011C4C0323017C1585C7658B6C125DC +:10F7C000E06BC290EA1B3D75089CE0A011ABC0A3A2 +:10F7D000E06BCCCDEA1B3ECC089CE0A011AFC02270 +:10F7E00030270E9C5C5CE3CD80FED70380013A5449 +:10F7F00080011BE880011C7C80011C94EBCD42FF42 +:10F800001895169714931091300230063004C0E812 +:10F81000401C5C54081C580CC0240E0CEA0C032C31 +:10F82000049BE0A00FA718922FF4E6041800CF1352 +:10F83000069CE0A011BF189B049CE0A01065830CFF +:10F840003004C1B8401B5C54089C162C580CC024D2 +:10F850000E0CEA0C0022620C640BE0A00F1D189045 +:10F86000620C640BE0A00F18009BE0A00FD90C9B6A +:10F87000E0A00F8018962FF4E6041800CE43069CF3 +:10F88000E0A01198189B0C9CE0A0103E40AB970C98 +:10F89000E3CF82FF800117F080011978800118CC36 +:10F8A00080011D0C00043A001302F1EC560400F92B +:10F8B0000000800100FA00010000F6D6010D02F1FF +:10F8C000EC5603000000010080011A60D401FEB074 +:10F8D000B9D52D5C198C580CC2C0E06C3828EA1CD4 +:10F8E0000000785BF72A0021581AC0652F3B178B60 +:10F8F000581BC025DA0A787BF72A0021581AC05510 +:10F900002F3B178B581BCF74786CF92B0021581B99 +:10F91000C205F93B000D581BC1C5F92B0013584B0C +:10F92000C0512D8C980C581CCE64585BC121DA0A4A +:10F93000300CC0C8E06B3828EA1B0000F60C032B23 +:10F940002F3B178B581BCD742FFC5C6C58ACCF35FC +:10F95000D80A0000D401189BF73C000D585CE084E5 +:10F96000013CF7290004F73C000DF72A00005C5A1F +:10F97000589AF9BA0205FE0A001A94CA140F001424 +:10F980000058009C00E0015A057E021C01A801FEFF +:10F99000E06A1E50EA1A0000F80C1006180A762CCD +:10F9A000F809041CF55C0078762CF738000C120876 +:10F9B000F808041CF55C007A762CF738000CF20885 +:10F9C0000019F809041C284A00DA96001302F1EC29 +:10F9D000560400FA0000800100FB00010000496DA0 +:10F9E000010D02F1EC56030000000100B40C2F3BA6 +:10F9F000178C2FFCB68CD80AE06A1E50EA1A000059 +:10FA0000F80C1006180A762CF809041CF55C00980E +:10FA1000762CF738000C1208F808041CF55C009AE4 +:10FA2000762CF738000CF2080019F809041CF55C74 +:10FA3000009C2F3B178C2FFCB68CD80AE06A1E5016 +:10FA4000EA1A0000F80C1006180A762CF809041CB3 +:10FA5000F55C00B8762CF738000C1208F808041C86 +:10FA6000F55C00BA762CF738000CF2080019F8099A +:10FA7000041CF55C00BC2F3B178C2FFCB68CD80AFD +:10FA8000F2081501762A100A940A580AC131762A1A +:10FA9000F73E000C120EF40E041A580AC0B1762A72 +:10FAA000F73E000CF20E001EF40E041A580AE08015 +:10FAB0000238A37CE06A1E50EA1A0000140C762A71 +:10FAC000F408040AA96AF94A0050762AF738000CAB +:10FAD0001208F408041A79481408F9480050762AE4 +:10FAE000F738000CF2080019F409041A0034460033 +:10FAF0001302F1EC560400FB0000800100FC000141 +:10FB000000005D45010D02F1EC560300000001000C +:10FB10002ACCB80A2F3B178C2FFCB68CD80AA37CB2 +:10FB2000E06A1E50EA1A0000140C762AF409041A3E +:10FB3000B80A762AF738000C1208F408041AB81A22 +:10FB4000762AF738000CF2080018F408041AB82ACC +:10FB5000762AF738000C303EF00E0349F409041AF7 +:10FB6000B83A2F3B178C2FFCB68CD80AA37CE06ADE +:10FB70001E50EA1A0000140C762AF409041AF95AE5 +:10FB80000028762AF738000C1208F408041AF95AEB +:10FB9000002A762AF738000CF2080018F408041A34 +:10FBA000F95A002C762AF738000C303EF00E034943 +:10FBB000F409041A2D2CB80A2F3B178C2FFCB68C95 +:10FBC000D80A762AF409041AE0691E50EA190000DE +:10FBD000120CF96A00F82F3B178C2FFCB68CD80A50 +:10FBE000E06A1E50EA1A0000F80C1006180A762C7B +:10FBF000F809041CF55C00D87628F73C000C1809BD +:10FC0000F009041CF55C00DAF70C0028581C5F4C66 +:10FC100000AF27001302F1EC560400FC0000800145 +:10FC200000FD0001000037FD010D02F1EC5603005C +:10FC300000000100F56C00DC2F3B178C2FFCB68C0C +:10FC4000D80AF73C000D585CE081018FF7290004C9 +:10FC5000F72C00005C5C589CF9BC02052FECFE0CF4 +:10FC6000001FC098C388C678C968CC28C7A9C4A992 +:10FC7000CF78C3393018C128F00C1006180AF50CDB +:10FC80000078F55C0072F50C007AF55C0074F50CF8 +:10FC9000007C28AAB40C2FF85C68E06A1E50EA1AAF +:10FCA00000005858CEA5762CF809041CF55C00908D +:10FCB000762CF738000C1208F808041CF55C00924A +:10FCC000762CF738000CF2080019F809041CF55CD2 +:10FCD0000094C4793018C128F00C1006180AF50CED +:10FCE0000098F55C0092F50C009AF55C0094F50C18 +:10FCF000009CF55C00962FF85C68E06A1E50EA1ADA +:10FD000000005858CEA5762CF809041CF55C00B00C +:10FD1000762CF738000C1208F808041CF55C00B2C9 +:10FD2000762CF738000CF2080019F809041CF55C71 +:10FD300000B4C1790075BD001302F1EC560400FD5A +:10FD40000000800100FE00010000A236010D02F15A +:10FD5000EC560300000001003018C128F00C10061A +:10FD6000180AF50C00B8F55C00B2F50C00BAF55CA9 +:10FD700000B4F50C00BCF55C00B62FF85C68E06AD6 +:10FD80001E50EA1A00005858CEA5762CF809041C1B +:10FD9000F55C00D0762CF738000C1208F808041C2B +:10FDA000F55C00D2762CF738000CF2080019F8093F +:10FDB000041CF55C00D4CE78301CC0C8F40C003AAA +:10FDC0007548F5480048F50800542B4AB4082FFC44 +:10FDD0005C6CE06A1E50EA1A0000585CCF05762C75 +:10FDE000F809041CA96CF54C0070762CF738000C4F +:10FDF0001208F808041C75C81808F5480070762C1D +:10FE0000F738000CF2080019F809041C28CAB40CD1 +:10FE1000CBA8301CC108F40C003A14982088940E2A +:10FE2000B00E2FEA940EB01E941EB02E942AB03A53 +:10FE30002FFC5C6CE06A1E50EA1A0000585CCEC5CC +:10FE4000762CF809041CF55C0020762CF738000CA1 +:10FE50001208F808041CF55C00D7C0001302F1EC8E +:10FE6000560400FE0000800100FF000100001D8D0F +:10FE7000010D02F1EC560300000001000022762C77 +:10FE8000F738000CF2080018F808041CF55C002490 +:10FE9000762CF738000C303EF00E0349F809041CAC +:10FEA0002DAAB40CC828301CC158F40C003AF5082F +:10FEB0000028F5580020F508002AF5580022F5081A +:10FEC000002CF5580024F508002E2DAAB4082FFCAC +:10FED0005C6CE06A1E50EA1A0000585CCE75762C05 +:10FEE000F809041CF55C0048762CF738000C120861 +:10FEF000F808041CF55C004A762CF738000CF20870 +:10FF00000018F808041CF55C004C762CF738000C3F +:10FF1000303EF00E0349F809041C2B2AB40CC458D7 +:10FF2000301CC088180AF53800F8F56800F72FFC77 +:10FF30005C6CE06A1E50EA1A0000585CCF45762CD3 +:10FF4000F809041CF56C00FCC3083018C128F00C3B +:10FF50001006180AF50C00D8F55C00D2F50C00DA92 +:10FF6000F55C00D4F53C00DCF56C00D62FF85C683D +:10FF7000E06A1E50EA1A00005858CEA5005E8700BD +:10FF80001302F1EC560400FF0000800101000001A3 +:10FF9000000058E5010D02F1EC56030000000100DD +:10FFA000762CF809041CF55C00F0762CF738000C70 +:10FFB0001208F808041CF55C00F2762CF738000CE7 +:10FFC000F2080019F809041CF56C00F4305C2F3BB2 +:10FFD000B68CD80AEBCD40801897FEB0B6BBEDB713 +:10FFE0000002C382E06B3828EA1B0000765B179A98 +:10FFF000581AC305F73A000DE0691F50EA190000CE +:020000021000EC +:10000000585AC0F4F20A0019F93A0043B28A2BCCCC +:10001000198CB29C2F3B178C2FFCB68CE3CF8080C1 +:10002000301AC0B8F20A0018109E202E1187BC8723 +:100030001198BC982FFA5C6A585ACF55F93A004388 +:10004000F36A00082BCC198C2F79B28C305C2F3BD3 +:10005000B68CE3CF8080D70380006DB0D531208D82 +:10006000300BBACBE06706A8EA170000780B8F0BBD +:10007000781B8F1B782C8F2C3006300C504C507C0A +:10008000506C505C305A0E9B2F8B6E4CE0A002726D +:10009000305A0E9B2FCB6E5CE0A0026C305A0E9B48 +:1000A000000468001302F1EC560401000000800116 +:1000B0000101000100005408010D02F1EC5603009B +:1000C000000001006E6CE0A002673059FACAFFF030 +:1000D000303B6E4CE0A0027618913059FACAFFE42A +:1000E000303B6E5CE0A0026E18923059FACAFFE80D +:1000F000303B6E6CE0A002661890305A303B6E4C7C +:10010000E0A002A8FC1B4040E0A00C8E502C6E1416 +:100110006E03300B069CE0A05B23C0E1300B089C13 +:10012000E0A05B1EC0916E2C300BE0A05B19C041BB +:10013000E0A0022830163005EF3C000D503C6E2B3D +:10014000169CE0A00BFD500C089C089BE0A00BF84F +:100150001894069C069BE0A00BF3089BE0A00B9A6A +:10016000400BE0A00B97E0A01C59E0A04DD7E0A009 +:100170000D1F500C305A1A9B6E7CE0A0020D400CF3 +:10018000E06B0CDDEA1B40FBE0A00D68C093400C67 +:10019000E06B49A7EA1B413CE0A00D54C043CF1DD2 +:1001A000300CCE683059FACAFFEC303B6E7CE0A0D0 +:1001B0000209FC1B4060E0A00D51CF22E06B666796 +:1001C000EA1B3FE600930A001302F1EC560401011A +:1001D00000008001010200010000C1C3010D02F115 +:1001E000EC56030000000100029CE0A00D49CEA2E5 +:1001F000402CE06B1B3EEA1B4130E0A00D41C17278 +:10020000402CE06BB4D7EA1B4109E0A00D2DC0F3F0 +:10021000EF3C000DE04C00FFCD50E06C00FF2F37AD +:10022000AE8C3FFC409BB68C301CCB48402CE0A0F1 +:100230001C07BFDB3008FC194010E0A01C21C6B22F +:10024000FC144000049C089BE0A00D1AC5823006F7 +:100250006E2C400BE0A00BFAE0A01BF2E0A04C706B +:10026000E0640728EA140000FC188000E069A5DCBF +:10027000EA19404CE0A01B5BE0A0573EE0A01C2B1D +:10028000891C5C56C5B1681C5C4CE04C003DC9A49F +:100290006E1CE0A01BD514981699109212936E0C48 +:1002A000EE1C8000E0A01BCC04980699E0A04EB89C +:1002B000FC188000E069A5DCEA19C04CE0A01B37FF +:1002C000E0A0571AE0A01C0718955805C034FE3569 +:1002D000FE980A9C2D3C35ABF80B0C0A1496584638 +:1002E000C02130066813069B001210001302F1ECC7 +:1002F00056040102000080010103000100007E7825 +:10030000010D02F1EC560300000001000C9CC6FC3C +:10031000C060069A0A9B0C9CC7ACC1C1C56DC208DF +:10032000049C089BE0A00CB2FE92FF5F009C089B1F +:10033000E0A00CACCA03C58B3059FACAFFF0305BA1 +:100340006E4CC63DFC1B3F80E0A00CACFE92FF4D06 +:10035000C91BEF3C000E0C3CC030EF66000EEF3CBA +:10036000000E403B163CC051403BE04B00FFC23109 +:100370006816680BE21B0006C030301CC0480C9A9F +:100380000A9BC8BC5C46E046003DC1545C5CC13081 +:10039000EF3C000EEF3B000DF80B1800C0C0EF6CF7 +:1003A000000D409BB68C301BBACBE04C00FFC03038 +:1003B0002F47AE8C1BCC2F8DD932D7038001B79835 +:1003C00080019D5480011BE880013A9480019B5478 +:1003D00080013A548001A034800139428001B10C7F +:1003E00080013AEA80011C7C80011C94E06A0008CC +:1003F000EA1A0000F40C003A740C183BC055741C47 +:10040000163C5F4CC028300C5C5C5EFC0074F00055 +:100410001302F1EC56040103000080010104000105 +:1004200000006A50010D02F1EC56030000000100CB +:10043000D401E06906A8EA1900002F491389E06891 +:100440000728EA1800007008E2180006C030C37CD4 +:10045000D8025809C335123CC0C0129A2FFAF408CA +:100460001401BF881408A348F408012A143CC101F0 +:10047000F80A105A228A580CC091E04B013BC08503 +:10048000FE3AFE98143BC044D80A143BCFE5123C18 +:10049000C0B02FD9F20A1401BF8A120AA34AF20A85 +:1004A0000129123CC0B1F80A105A2D8A580CC041DB +:1004B000E04B002EC034163ACE85DA0AEBCD40F878 +:1004C000210DE06E06A8EA1E0000FD35000CE06775 +:1004D000C944EA1780011A990E983144110612A6F0 +:1004E0002044CFD13006401914985C4840040838A5 +:1004F000C05514985C481238C0B5402814965C4624 +:100500001236C31514995C491039C2D430165805F7 +:10051000C695580CC3D50A3CC0C00A9A2FFAF409F4 +:100520001401BF891409A349F409012A143CC361C9 +:10053000002807001302F1EC5604010400008001BA +:1005400001050001000000E8010D02F1EC56030076 +:10055000000001001A940E9A2ECA3403B509A92886 +:100560002083CFD1EC0A15041A99120A580CC24103 +:100570007409123BC254741A163AC224E06C00FF8C +:100580002F2EBC8C300CC418403914965C461036A3 +:10059000C07514985C481238C0343026CCBB14980F +:1005A0005C481238C07540495C4A1439C035303651 +:1005B000CC1B300CC2A8F40C032A143BCE050A3C19 +:1005C000C0B02FD5EA0A1401BF8A0A0AA34AEA0A70 +:1005D00001250A3CC1911A9A2AC73405AF09B528EA +:1005E0002085CFD1A5660C9A1A99120A580CC081A1 +:1005F000740C163CC094743C183BC064CC0BF40CD7 +:10060000032C163CCBC5301C2F0DE3CD80F8000029 +:10061000E06C00FFE06B06A8EA1B00002F2BB68CF5 +:100620005EFD00009889F4091900C0333009B8094B +:1006300098892FF9B8099889F4091900C033300A4C +:10064000B80A760B988AF80A002C991B5EFF000006 +:10065000D431201D00D818001302F1EC5604010516 +:10066000000080010106000100009523010D02F148 +:10067000EC56030000000100189616911490129495 +:10068000300530038C875C87029CE0A00B931892A6 +:10069000F5D4C010F7D1B0100C9CC35C049BE0A053 +:1006A0000A1D810CC058089720175C872FF3E203BE +:1006B0001900C184EC070022641C600BE0A008D67E +:1006C000500C641C600BE0A008D1400BE0A0099224 +:1006D0000A9BE0A0093918955817CE6520175C874A +:1006E000CE6B029CE0A00B66189B0A9CE0A009F66A +:1006F0002FFDD832800117F08001197880011D3854 +:1007000080011A60EBCD40F8189516971496300CBE +:1007100030048A83C1085C835803C075EA03002B48 +:10072000761BE0A0091120135C835803C0340C939E +:1007300020132FF4EE041900CEF5E3CD80F8D70393 +:10074000800118CC300BF96B000DE06B3828EA1BE8 +:10075000000076ABF71A005C3019F9280000F208A7 +:10076000094C184A2A4BB60A5EFF0000300BF96BA1 +:10077000000DE06B3828EA1B00AC3E001302F1ECE0 +:1007800056040106000080010107000100002A98BC +:10079000010D02F1EC56030000000100000076ABF1 +:1007A000F71A005C3019F9280000F208094C188A81 +:1007B0002A4BB60A5EFF00005EFF0000EBCD40F85A +:1007C000204D189516941297EA0A001C0E0C581723 +:1007D000C050F92B0015580BC1012EBCF92B00009D +:1007E0002FFBB88BEA07000C2DFCF92B00002FFB28 +:1007F000B88B0B9C2FFCAA9CEA070003E72600217C +:10080000FAE700080B9AEB2B0000BB1BE06CCF044F +:10081000EA1C8001FEB0B438300CC0282FFC5C6CA0 +:10082000586CC104EA0C001B0E0B2EBBF72A00000B +:10083000581ACF555804C0241894E76400112ED3D9 +:10084000A68C2FCDE3CF80F8EBCD40F8204D189546 +:1008500016941297EA0A001C0E0CEA070003F92B03 +:100860000015581BC1252EBCF92B0000201BB88B8E +:10087000E72C0021201CE76C00210B9C581CC05564 +:100880000B9CFE3CFF01AA9CE7260021FAE700082A +:100890000B9AEB2B0000BB1BE06CCEE400B88E0083 +:1008A0001302F1EC56040107000080010108000169 +:1008B0000000BD73010D02F1EC56030000000100C1 +:1008C000EA1C8001FEB0B3F2300CC0282FFC5C6C37 +:1008D000586CC114EA0C001B0E0B2EBBF72A00004B +:1008E000581ACF555804C0241894E76400112ED329 +:1008F000A68CC0683FFCE76C00112ED3A68C2FCDD0 +:10090000E3CF80F880006FE8180BF72A0011580A2F +:100910005E5DE06A3828EA1A000074AA2EDBF72927 +:100920000000F409001A28EA940B2DCC980C580CFE +:10093000C0245EFD5C8B5E1D302C5EFCD401F3DABE +:10094000B008F5DBB0083FFBC4CFD80AD401F3DA16 +:10095000B008F5DBB0083FFBC8AFD80A584CC0411F +:100960005C6B5F0CC028300C5C5C5EFCEBCD40E047 +:1009700018951497585BC0303046C0283056F7D7CA +:10098000B008F9D6B008CEBFC0403FFCEB5C0028F1 +:10099000F3D7B008F5D6B008302B0A9CC22FE3CFAE +:1009A00080E00000EBCD40E018951497585BC03014 +:1009B0003046C0283056F7D7B008F9D6B008CCFF7B +:1009C00000F6AA001302F1EC5604010800008001B1 +:1009D000010900010000FDC8010D02F1EC56030001 +:1009E00000000100C110EB0C0028580CC0A4E06C02 +:1009F0000100EA1C0000980C2D85AA0CE3CF80E0D2 +:100A00003FFCEB5C0028F3D7B008F5D6B008302BDC +:100A10000A9CC3FFE3CF80E0D42118961697EC0719 +:100A2000000CF92B0011580BC2F52EDCF925000043 +:100A3000E06C3828EA1C000078ACF805001C28ECB3 +:100A40009804F7D7B008F9D5B008C9BFC0F0584529 +:100A5000C121089C2C4CE06B00F0F80B0C0A580BE1 +:100A6000C0A1300C2DA6AC8CDA2A5845C041E04418 +:100A70000384CF805855C041E04426E8CF30ED0CC8 +:100A80000024580CC024D82A5804C221301CED6C14 +:100A9000000FF7D7B008F9D5B008C73FC170ED0C0B +:100AA0000028581CC135ED0C0028201CED5C0028E6 +:100AB000ED0C0028580CC0A1F5D7C008F7D5B00838 +:100AC000ED2C0000E0A02EF2D82A302CD822F7D747 +:100AD000B008F9D5B008C55FCD70E06C00F0E80C47 +:100AE0000C0A580B007D21001302F1EC5604010999 +:100AF00000008001010A000100006803010D02F1FD +:100B0000EC56030000000100CD11300C2F16AC8C08 +:100B1000302CD822800167C4EBCD40801897169AFC +:100B20000E0A2EDAF52C0000C3EFC0702D878E0C54 +:100B3000580CC034E3CF8080E3CF9080EBCD40C031 +:100B400018971696EE06000A2EDAF52C0000C2BFA2 +:100B5000C070EF0C0028580CC034E3CF80C0F7D62B +:100B6000B0080E9CC4CEE3CF90C00000D401FE7A42 +:100B7000FE98F95A0024C2FED8020000D401F3DA2C +:100B8000B008303A302BC51ED80A0000D401F3DA81 +:100B9000B008303A302BC8FED80A0000180BF72AEC +:100BA0000011580A5E5DE06A3828EA1A000074AA4B +:100BB0002EDBF7290000F409001A28EA940BE04B19 +:100BC000003CC051300B2DACB88B5EFFE04B007881 +:100BD000C051301B2DACB88B5EFF2DCC980C580C3F +:100BE000C0245EFD580B5E1D302C5EFCD401388A9B +:100BF000F95A0024FEB0FDF0D8020000D401FE7ABC +:100C0000FED4F95A0024FEB0003B92001302F1EC2E +:100C10005604010A00008001010B00010000D7B852 +:100C2000010D02F1EC56030000000100FDE7D802BF +:100C3000EBCD40C018971496F3D6B008300A3FFBAE +:100C4000FEB0FE060C073FFCEF6C00112ED7AE8CF9 +:100C5000E3CF80C0EBCD40C018971496F3D6B00810 +:100C6000300A3FFBC3AE0C073FFCEF6C00112ED7E0 +:100C7000AE8CE3CF80C00000E06C3828EA1C000096 +:100C8000784B179B581BC064788C199C580C5F0CD0 +:100C9000C028301C5C5C5EFCEBCD40C0E06C3828AA +:100CA000EA1C0000788778460F9C580CC0710D9C98 +:100CB000581CC0456CBC781C5D1C0D9C580CC05168 +:100CC0000F9C580C5F0CC028300C5C5CE3CD80C0DE +:100CD000D401FEB0FD93FEB0B103300BF96B0043BD +:100CE000F96B00452AECB88BDA0A0000D401FEB09B +:100CF000FD99FEB0B0F5300BF96B0043F96B004580 +:100D00002AECB88BDA0AD70380006DB0E06C382883 +:100D1000EA1C0000784B179B581BC064785C199C38 +:100D2000580C5F0CC028301C5C5C5EFC00C0550099 +:100D30001302F1EC5604010B00008001010C0001CC +:100D40000000C390010D02F1EC5603000000010009 +:100D5000EBCD40C0E06C3828EA1C0000785778469C +:100D60000F9C580CC0710D9C581CC0456CBC781C65 +:100D70005D1C0D9C580CC0510F9C580C5F0CC0287A +:100D8000300C5C5CE3CD80C0EBCD40C0E06C38281B +:100D9000EA1C0000785778860D9C581CC0440F9CB4 +:100DA000581CC0456EBC781C5D1C0D9C580CC05175 +:100DB0000F9C580C5F0CC028300C5C5CE3CD80C0ED +:100DC000E06C3828EA1C0000789C199C580C5F0CD9 +:100DD0005EFC0000D401E06C3828EA1C0000780CAE +:100DE000199B580BC04178BC781C5D1CDA0A0000C6 +:100DF000D401FEB0FD29E06C3828EA1C0000780C14 +:100E0000199B580BC04178BC782C5D1CDA0A000095 +:100E1000EBCD40C0206D1A9C300A300BB91BF8EBAB +:100E20000008F8EB0010E06600EE30181A99E06A4E +:100E300000D0F7D6C008303CFEB0B1FE1B8BE04BB3 +:100E40000055C671581CC651E0670730EA1700000C +:100E5000007949001302F1EC5604010C00008001F6 +:100E6000010D00010000A928010D02F1EC5603005C +:100E700000000100304C8F7C303CEF5C0020EF5CC8 +:100E80000022355CEF6C001631681A99E06A00AAFE +:100E9000F7D6C008303CFEB0B1E1C0412FADE3CD84 +:100EA00080C01B8A1B9BF7EA108AAE0A1BAA1BBBD9 +:100EB000F7EA108AAE1A1BCA1BDBF7EA108AAE2AC1 +:100EC0001BEA1BFBF7EA108AAE3AFB3A0008FB3B31 +:100ED0000009F7EA108AAE4AFB3A000AFB3B000B16 +:100EE000F7EA108AAE5AFB3A000CFB3B000DF7EA1A +:100EF000108AAE6AFB3A000EFB3B000FF7EA108A3D +:100F0000AE7AFB3A0010FB3B0011F7EA108AEF5A69 +:100F10000010FB3A0012FB3B0013F7EA108AEF5A6D +:100F20000012FB3A0014FB3B0015F7EA108A2EC7AB +:100F3000AE0ACB5B300CCB3BEBCD4080201D1A9C26 +:100F4000300BB88BB89BE0670028EA170000300C24 +:100F50008F0CAECC301C8F3CE06C00F4BA8C32ECC1 +:100F6000BA9C30291A9AE06B00EE303CFEB0B14AD0 +:100F70000E9B2F0B00B12C001302F1EC5604010D57 +:100F800000008001010E000100003CE3010D02F1B0 +:100F9000EC56030000000100300A970AB6CA300B75 +:100FA0002F87AE8B2FFDE3CD80800000D401201D64 +:100FB0001A9C300BB88BB89BE06C00F4BA8C32EC06 +:100FC000BA9C30291A9AE06B00EE303CFEB0B12C8E +:100FD0002FFDD802EBCD4080187CC050201CC19062 +:100FE000E3CF9080E0670028EA1700000E9C2F0CEA +:100FF000CC4CC2010F8C580CC0410F9C580CC1A0A6 +:10100000300CE06B0028EA1B0000973CE3CF908097 +:10101000E0670028EA1700000E9C2EECC8ACC0A1C7 +:101020000FAC580CCEE10FBC580CCEB10FCC580C05 +:10103000CE81E3CF90800000EBCD40C0202D1897EB +:101040003006300C501C5C5BC0A0E06C0730EA1C22 +:101050000000786CF3BC0004501CC1781A9C300B63 +:10106000B88BB89B30281A99E06A00F6E06B00EE66 +:10107000303CFEB0B10518965816CF511B8C1B9B07 +:10108000F7EC108CCDCC501C401CF80C100A501CF6 +:10109000401CA94CAECC401C00EC87001302F1ECC4 +:1010A0005604010E00008001010F0001000083586A +:1010B000010D02F1EC56030000000100AEDC0C9CB7 +:1010C0002FEDE3CD80C00000300CE06B0028EA1B60 +:1010D00000002F8BB68C5EFF300CE06B0028EA1B03 +:1010E00000002F8BB68C5EFFEBCD40C01897E066FA +:1010F0000028EA1600000C9C2F0CC79CED3B000852 +:10110000582BC0B40C9B2F0B300A970AB6CAED3B84 +:1011100000082FFBED6B00086C3B580BC0910C9B3B +:101120000E98305A173910C9201ACFD1C0F80C9A2E +:101130002F0A0E98305B153910C9201BCFD10C9B9C +:101140002F0B760A8D0A17CAACCA301B8D3BE3CD34 +:1011500080C00000EBCD4080201D1A9B300AB68A6B +:10116000B69AE06700EE30381899E06A00F6F7D7D3 +:10117000C008303CFEB0B096C031300CC0D8E06C36 +:1011800000F4BA8C32ECBA9C30291A9AF7D7C0080E +:10119000303CFEB0B05B2FFDE3CD8080EBCD4080D6 +:1011A000201D1A9B300AB68AB69AE06700EE3028F6 +:1011B0001899E06A00F6F7D7C008303C00A03F005D +:1011C0001302F1EC5604010F000080010110000130 +:1011D00000009330010D02F1EC5603000000010005 +:1011E000FEB0B072C031300CC0C8E06C00F4BA8CF4 +:1011F000BA9C30291A9AF7D7C008303CFEB0B038F4 +:101200002FFDE3CD8080D703800070E48000708CD8 +:10121000EBCD4080203D1897300C501C500C502CCA +:10122000501C0F8B0F9CF9EB108B501B401CC2BC49 +:10123000500C0FABB16B0FBCF7EC108B0FCC184BF5 +:10124000E06C0730EA1C00002E0C980CF80C11081A +:10125000F60C0A4B502B402CC34C501C401CB14C7C +:10126000AE8C401CA94CAE9C401CAEAC400CF80CA3 +:10127000100A500C400CA94CAEBC400CAECC2FDD7B +:10128000E3CF9080E0690730EA190000F33B0016D5 +:10129000E04B0055C10192DB161C92CBB73CAF5C12 +:1012A000F30B0012AB7BF30A0014180AF60A0C0ABF +:1012B000140C936C726CF3BC00045C8C5EFC00003C +:1012C000EBCD40C0E0690730EA1900007268E02801 +:1012D0000FA0F008024EAD4E92BB9227B137AD572A +:1012E000005F1E001302F1EC5604011000008001A3 +:1012F000011100010000878D010D02F1EC56030081 +:1013000000000100926ABD3AB14A0E0AF3BA000227 +:10131000FE3A8000B73AAF9AF30700209206927B1C +:10132000B73EAB5EFC06002B9219B338AB581608DB +:10133000F007094BF3BB0002161CE06BC350F60725 +:10134000084BB73CFC1B8000163CC062A17CF80A2D +:101350000D0A149CC058F80A0D0A149CA17CF80AC6 +:101360001408B53AE06B0BDEB73AB14AFE7BE343B3 +:10137000B93BB14B160AFE3AF131A54A140CE3CD44 +:1013800080C00000D401206D301B300AE0690730B6 +:10139000EA1900009208F00E1510C0505BF85F18B3 +:1013A0005008C038300850089218F00E1510C05080 +:1013B0005BF85F185018C038300850189228F00EAB +:1013C0001510C0505BF85F185028C03830085028FE +:1013D00092B8F00E1510C060E048FFFF5F1850385B +:1013E000C0383008503892C8F00E1510C060E04880 +:1013F000FFFF5F185048C0383008504892D9F208B3 +:101400001510C060009AE5001302F1EC56040111BA +:10141000000080010112000100001246010D02F1DE +:10142000EC56030000000100E049FFFF5F1950592E +:10143000C038300950593009C0881A98F00903287B +:101440005808C0212FFA2FF95869CF85586AC02152 +:10145000300BB88B169C2FADD8020000D401169922 +:10146000300B201CC040201CC060C0A8FEB0FDE8AE +:10147000189BC0685C5A5F1B129CC27E189B169C0E +:10148000D8020000EBCD40C0201DE06CD124EA1C46 +:1014900080011A9B198AB68A199AB69AFACBFFFE6E +:1014A0002FEC198AB68A199AB69A3018FAC9FFFE33 +:1014B00030FA33CB300CFEB0AF2B18975817C771EA +:1014C0001BACE04C0040C731320CBA8C36FCBA9CE5 +:1014D00030291A9A33CB300CFEB0AEEEC031300C4E +:1014E000C688324CBA8CE06C00C0BA9C30291A9A7B +:1014F00033CB300CFEB0AEE0CF30325CBA8C310C66 +:10150000BA9C30291A9A33CB300CFEB0AED5CE80BF +:1015100035ACBA8CE06C00F0BA9C30291A9A33CB07 +:10152000300CFEB0AEC9CDC000339B001302F1EC0D +:101530005604011200008001011300010000ADFDFE +:10154000010D02F1EC5603000000010035BCBA8C1D +:10155000301CBA9C30291A9A33CB300CFEB0AEBE88 +:10156000CD10323CBA8C308CBA9C30291A9A33CBCD +:10157000300CFEB0AEB3CC60340CBA8C305CBA9C8C +:1015800030291A9A33CB300CFEB0AEA8CBB0341C45 +:10159000BA8C311CBA9C30291A9A33CB300CFEB06D +:1015A000AE9DCB00342CBA8C3006BA9630291A9AEC +:1015B00033CB300CFEB0AE92CA50320CBA8CBA9615 +:1015C00030291A9A33CB300CFEB0AE88C031C9AB8B +:1015D00030070E9C2FFDE3CD80C00000D421202DCC +:1015E000E06CD05CEA1C80011A9B198AB68A199AB1 +:1015F000B69A781C501C301CBA8CE06C0080BA9CE7 +:1016000030291A9A33CB300CFEB0AE68C031300CA2 +:10161000C7183048FAC9FFFC350A33CB300CFEB08E +:10162000AE89C0901BCCE04C00ACC1001BCCE04CA0 +:1016300000CAC0C0E06C0690EA1C0000300B990B99 +:10164000991B3ECA992A993BC4A81BCC001362007F +:101650001302F1EC56040113000080010114000193 +:101660000000B9D5010D02F1EC56030000000100A5 +:10167000E04C00ACC1B11BDC1897EFD7C007EDBC44 +:101680000007C0225C371BEC1896EDD6C007EDBCF6 +:101690000007C0225C361BFC1895EBD5C007EDBCDB +:1016A0000007C0225C353004C2481BCCE04C00CAA5 +:1016B000C2011BDC189BF7DBC007F6071100EDBC6D +:1016C0000007C02216971BEC189BF7DBC007F60635 +:1016D0001100EDBC0007C02216961BFC189BF7DB1F +:1016E000C007F6051100EDBC0007C02216953014A6 +:1016F000E06C0690EA1C0000990799169925993428 +:10170000301CBA8C300CBA9C30291A9A33CBFEB0FC +:10171000ADF7C900301C2FEDD8220000EBCD408082 +:10172000201DE067CEA4EA1780011A9C0F8BB88BAE +:101730000F9BB89B320CBA8C36FCBA9C30291A9A93 +:1017400033CB300CFEB0ADDC581CC0702FC70E9CE4 +:10175000FEB0AD84300CC078C54F2F470E9CFEB054 +:10176000AD7D301C2FFDE3CD80800000EBCD4080AF +:10177000001548001302F1EC56040114000080012A +:10178000011500010000D36D010D02F1EC560300BC +:1017900000000100201DE067CEC4EA1780011A9CFA +:1017A0000F8BB88B0F9BB89B320CBA8C300CBA9C49 +:1017B00030291A9A33CBFEB0ADB5581CC0702FC774 +:1017C0000E9CFEB0AD5D300CC0B8301A300B304C02 +:1017D000FEB0B0862F470E9CFEB0AD52301C2FFDE0 +:1017E000E3CD8080EBCD40F8202D18931694305730 +:1017F000E066CE2CEA168001AD0ABB1B300CE0651A +:101800000690EA150000EB5C0010EB5C0012EB5C4C +:10181000001430181A99327A33CB300CFEB0ADAECA +:10182000581CC1511B8CEDBC0003C112F1D4C0087F +:101830000699E06A00A833CB300CFEB0AD9FC12101 +:101840002F060C9CFEB0AD1C300CC3C80E9CFE379E +:1018500000015C7CCDF12F860C9CFEB0AD11300CEC +:10186000C3183007E0A0523A29AC988C580CC0A19C +:10187000E06C3828EA1C0000781C199C581CC02514 +:1018800030175C576A3C1837C1C16A0CF80C107DE0 +:10189000A37C33CB001E6C001302F1EC560401153F +:1018A0000000800101160001000046A6010D02F1B2 +:1018B000EC56030000000100F80B0C0AEB5A001074 +:1018C0006A1CF80C107DA37C33CBF80B0C0AEB5A86 +:1018D00000126A2CF80C107DA37C33CBF80B0C0A99 +:1018E0002EC5AA0A301C2FEDE3CD80F8800070E4ED +:1018F0008001BA44EBCD4080201DE067D0F4EA17A8 +:1019000080011A9C0F8BB88B0F9BB89B357CBA8CCF +:10191000314CBA9C30291A9A33CB300CFEB0AD143E +:10192000C031300CC168301A301B304CFEB0AFEA09 +:10193000321CBA8C301CBA9C30291A9A33CB300C2A +:10194000FEB0AD02CEF02FC70E9CFEB0ACAB301C8B +:101950002FFDE3CD80800000EBCD4080201DE067AF +:10196000D104EA1780011A9C0F8BB88B0F9BB89B90 +:10197000301A300B304CFEB0AFC5321CBA8C300C74 +:10198000BA9C30291A9A33CBFEB0ACDEC031300C91 +:10199000C0682FC70E9CFEB0AC85301C2FFDE3CD78 +:1019A00080800000EBCD40F8202D1893CDCEE0676D +:1019B000CE58EA1780011A9C00170A001302F1ECB6 +:1019C0005604011600008001011700010000F91DF6 +:1019D000010D02F1EC560300000001000F8BB88BE3 +:1019E0000F9BB89BFACBFFFC0E9C2FEC198AB68A92 +:1019F000199AB69AFEB0AB4C1896300CBA1C357CCE +:101A0000BA8C3005BA9530291A9A33CB300CFEB017 +:101A1000ACADC031300CC448321CBA8C3014BA940E +:101A200030291A9A33CB300CFEB0ACA0CF40301A1C +:101A3000301B304CFEB0AF78A6840C9CFEB0AF409B +:101A4000581CC190301B0C9CFEB0AE269A9B2FFBFD +:101A5000BA1B0C9CFEB0B0BCC0602FC70E9CFEB081 +:101A6000AC33C0989A9CE04C0032CE852F470E9C38 +:101A7000FEB0AC2A301A300B304CFEB0AF55300BF4 +:101A80000C9CFEB0AF21321CBA8CBA9530291A9A40 +:101A900033CB300CFEB0AC6ACBE0C9FE301C2FED6E +:101AA000E3CD80F880006DB0800075E0800073B8F1 +:101AB000800078F080006FE880007648800075E84C +:101AC0008000708CEE1B8000E08F0006F7EC200891 +:101AD000E0860068F80B010AEE1A8000000203009D +:101AE0001302F1EC560401170000800101180001F7 +:101AF00000006EF6010D02F1EC560300000001003B +:101B0000F9BA0200140B141CF5DCC2E8E04A00FF2D +:101B1000C3F0F3DBC2E8C420A96BBFBB1429C0B07B +:101B200059A9C3B2F6090A48F2091120F609094B6E +:101B30005F1B104B1898E6188000A96CBFBC161CE0 +:101B4000C140F80B1200F80B094CF40B010AE08AB3 +:101B5000000EF1EC128BF7DAD2E8B96C5C0CF5BC34 +:101B60000601F7BB06FF5EFB5EFDF40A1109F409EE +:101B70001120C0805E3DF80A0A4B104BF809094C51 +:101B8000CEEB187CF5BC06015F6C104C5EFCF3DB01 +:101B9000B2E85BF9F9BC00FF5EFCF80915015E0DC7 +:101BA000A17B5E0C147AC080F6091200F609094B7D +:101BB000F2091108CB4BF20B010AF9BC0000A17C21 +:101BC0005D0A5EFAEE1B8000E08F0006F7EC20084D +:101BD000FE96FF8CF60C0C4AF60C0D4BF9DAC2E8B7 +:101BE000E04C00FFC350F3DBC2E8E0800033A96B98 +:101BF000BFBB1829C0B05999C2B2F6090A48F20908 +:101C000000FA17001302F1EC5604011800008001DD +:101C10000119000100002E4D010D02F1EC560300E8 +:101C2000000001001120F609094B5F1B104B1498AE +:101C3000E6188000A96ABFBA160AC1125C0CE04C13 +:101C400000FFF9BA0200F1EA129BF7DCD2E8B77A9A +:101C50005C0AF5BA0601F7BB06FF5EFBF1EA128BE0 +:101C6000F7DCD2E8B96A5C0AF5BA0601F7BB06FFF1 +:101C70005EFB5EFAF40915015E0AA17B5E0A187C20 +:101C8000C080F6091200F609094BF2091108CC4B85 +:101C9000F20B000BA17A5D0B5EFB0000F9EB200854 +:101CA000F5DCC2E8C3A0E04A00FFC2A0A96CBFBC3B +:101CB000F3DBC2E8C450E04900FFC3F0A96BBFBB2F +:101CC0001409F60C064AE6188000147A5F1AF5EB40 +:101CD000101C144BF80B1770F7B9070127E9E08ABD +:101CE0000038E04900FFC4C4F1EB128CF9D9D2E806 +:101CF000B96B5C0BF5BB0601F7BC06FF5EFCF1DCC3 +:101D0000D01FA17BF9B800FFF3DBB3085BF9F9BB87 +:101D10000100F1EB121C5EFCA97CC091E61880006A +:101D2000F5DBB2E800B947001302F1EC56040119E3 +:101D300000008001011A00010000BB86010D02F1C4 +:101D4000EC560300000001005BFAF9B800FF5EF8F2 +:101D5000F80A1200F80A094C5C3ACBDBF1DBD01F21 +:101D60005EF8A97BCEE0F6091200F609094B5C3952 +:101D7000CBABF2091109F20A1120C0E0F9BB030054 +:101D8000F6090A4C104CF60A094B5C0BF5BB060130 +:101D9000F7BC06FF5EFC167BF5BB06015F6B104BC4 +:101DA0005EFBEA187F805EF8F7EC2008F3DCC2E8FF +:101DB000C610E04900FFC710A96CBFBCF5DBC2E844 +:101DC000C740E04A00FFC7E0A96BBFBB163CF20A60 +:101DD000014A281AE08A007EE04A00FFC6E4F1DAF0 +:101DE000D2E81AD01AD8F6001601E0697999EA19F2 +:101DF000BA821220F6000648301A5C9A1429F200C2 +:101E00000648F2001502F60006481429F2000648BA +:101E1000F2001502F60006485C38F4090149F200A8 +:101E20000648F2001502E1E813E0F60006485C38C7 +:101E3000F4090149F2000648A369F3E813EAF80A35 +:101E40000648F20A1501E01A00CEC9001302F1ECAF +:101E50005604011A00008001011B00010000043D2E +:101E6000010D02F1EC56030000000100FFC02C0A36 +:101E7000F60A0648F809011CF7BA0840F4091200EE +:101E8000F409094A280A1B0C1B00E61CFF80A98ADA +:101E9000F9DAD0175EFCA97CC070F8091200F809C5 +:101EA000094C5C39C9EBF60915015E0EF5DBC2E899 +:101EB000E04A00FFC190E61880005EF8F5DBB2E86A +:101EC0005BFAF9BC00FFF1DCD01F5EF8A97BC070A3 +:101ED000F60A1200F60A094B5C3AC8BBEA187F8082 +:101EE000E618FF805EF8E6188000F6091509F60886 +:101EF00017105EF831A9A19CA19BE6188000BB8851 +:101F0000163CC023161C5CF8A17C2019CFA11099A7 +:101F10005CD95C3C5CF9F20B1506A579F6091770E3 +:101F2000F40A1109F40C1120C0F0F9B90300F20A07 +:101F30000A4BF1DBD01FF20C09495C09F5B9060127 +:101F4000F7B806FF5EF81279F5B906015F69F1D9B5 +:101F5000D01F5EF8F3DBC28BF7D9D2E7E02903810B +:101F6000E04900FEC0F2F60C1503F9EA005A4500FC +:101F70001302F1EC5604011B00008001011C00015A +:101F800000001015010D02F1EC56030000000100E5 +:101F900013DCB79BF9DBD2E9A37A5C0AF5BA060138 +:101FA000F7BC06FF5EFC2FF9E08A000EE049047FD3 +:101FB000C060EA1B7F80E61BFF805EFBF5EB10CA6A +:101FC000CFB05EFEF60C150BF9EA135CAB7A5F1A24 +:101FD000144CBFBCE61B8000F2091109F20A112063 +:101FE000C0F0F9BC0300F8090A481648B7D8F80A47 +:101FF000094C5C0CF5BC0601F7B806FF5EF8187CCE +:10200000F5BC06015F6C164C5EFC00003FFAB96A35 +:10201000F40C011AC073F40C001AF40B011AE082DC +:10202000000F1C9F3FFAB96AF40C011AC073F40C3C +:10203000001AF40B011AE08200035EFDF7EC100AAF +:10204000A17A5E0DC033163C1C9F183B1C9F0000FC +:10205000F7DCB2E927FB5E6DE04B00205E2EF60B4D +:10206000111FA96CBFBCF80B0A4C5EFCF7DCC2E880 +:1020700027FB5E3D59FBC0E2F60B111FF80A15085D +:10208000BFBAF40B0A4AF40B1100187CF60A176069 +:10209000000C8F001302F1EC5604011C00008001BB +:1020A000011D000100007AAD010D02F1EC560300A4 +:1020B000000001005EFABF5C5CDCEE1C80005EFC90 +:1020C000E0690000F80B12005E3DF80B094AF60BC0 +:1020D000111F281BF3EA128CF9DBD2E8B96A5C0AFB +:1020E000F5BA0601F7BC06FF5EFC00001899F80B74 +:1020F0001100E6198000F60C1760CE5BEBCD40FCBA +:10210000E06504BCEA15000030A9EB4900483078CE +:10211000EB48004CEB4800503058EB480054E06668 +:10212000999AEA169999E0679999EA173FC9AB1706 +:10213000E0663333EA163333E0673333EA173FD3CD +:10214000EAE70008E066999AEA169999E067999992 +:10215000EA173FE9EAE70010E0663333EA16333363 +:10216000E0673333EA173FF3EAE70018E0673333F9 +:10217000EA174003EAE70020E0673333EA173FE35A +:10218000EAE70028EB490058E064409CEA140000AC +:10219000780C3149F8090C08E9480048740C582CAF +:1021A000C031305CC2A8760C590CC230E04C010042 +:1021B000C080E04C00A6F8001302F1EC5604011DAB +:1021C00000008001011E00010000EF66010D02F118 +:1021D000EC560300000001000400C110E04C0800B0 +:1021E000C140C078E06C0100EB4C005C300CC17861 +:1021F000E06C0200EB4C005C301CC118E06C040089 +:10220000EB4C005C302CC0B8E06C0800EB4C005C80 +:10221000303CC058310CEB4C005C304CEA0C0033C5 +:10222000E066851FEA1651EBE0679EB8EA17402387 +:10223000A7080C9A0E9BE0A00D723008FC19401400 +:10224000E0A00D6DE8EB0034E8EB002CE068147BB7 +:10225000EA1847AEE0697AE1EA193F84E0A00D5F31 +:10226000E8EB003C300A300BA91BE8EB0008E8EB78 +:102270000010E8EB0018A70A0C980E99E0A00D4F8B +:1022800014921693FC173FE06B2CE0A00E3630083A +:102290000E99E0A00D4404980699E0A00D40A91BFA +:1022A0006B3CE0A00E2A30080E99E0A00D3804988F +:1022B0000699E0A00D34E8EB00086B4CE0A00E1D81 +:1022C00030080E99E0A00D2B04980699E0A00D2788 +:1022D000E8EB00106B5CE0A0005AED001302F1EC9B +:1022E0005604011E00008001011F0001000050DDA6 +:1022F000010D02F1EC560300000001000E10300841 +:102300000E99E0A00D1E04980699E0A00D1AE8EBC6 +:102310000018300CE94C0044301CEB4C0060EB4CD6 +:102320000064089C2B0CE94C004CE3CF80FC0000BF +:10233000E06C04BCEA1C0000301BF94B0060F94B58 +:1023400000645EFDD43120AD189730043005FACC1E +:10235000FFF0300A300BB91BF8EB0008F8EB001067 +:10236000300CFB6C0008E061409CEA110000413C2D +:10237000838C414CEE1C8000839C415CEE1C8000F1 +:1023800083AC31EA029B2E0B633CE0A009F16E0C9A +:10239000582CC041302C503CC038303C503C633C41 +:1023A000E06604BCEA1600006D8B580BC0E0580CC8 +:1023B000C080988C6D6B163CC045300CED4C0060B5 +:1023C000FB3C00082F6DD8326D9B580B31EAC3B02F +:1023D0006D6B5C8BE0A009F218936D670E9CFEB0EC +:1023E000FEAB189B069CFEB0FD3BE0A00D33ECEB72 +:1023F000003031EAF7D7B010633CE0A000869800C7 +:102400001302F1EC5604011F0000800101200001BD +:102410000000CFB6010D02F1EC56030000000100F0 +:1024200009FD18936D670E9CFEB0FE98189B069CE4 +:10243000FEB0FD28E0A00D20ECEB003831EAF7D724 +:10244000B010633CE0A00A0818976D6CFEB0FE86E1 +:10245000189B0E9CFEB0FD16E0A00D0EECEB0040AC +:10246000300CED4C0064C3D8300BE0A009AD1893DC +:1024700031EA6D6B5C8B633CE0A009A618976D6C2C +:10248000FEB0FE6C1892660C6E0BFEB0FBC3049B94 +:10249000FEB0FCF8E0A00CF0ECE80030E0A00B4E41 +:1024A000ECEB0030661C6E1BFEB0FBB4049BFEB070 +:1024B000FCE9E0A00CE1ECE80038E0A00B3FECEB1D +:1024C0000038662C6E2BFEB0FBA5049BFEB0FCDA38 +:1024D000E0A00CD2ECE80040E0A00B30ECEB0040B8 +:1024E000FACCFFF0300A300BB91BF8EB0008F8EB20 +:1024F00000103000C57831EAF7D0B010633CE0A09E +:1025000009631897ECE200306E0CE0A00CB504985B +:102510000699E0A00ADFBB1B6E0CE0A00CAD04988E +:1025200000605D001302F1EC560401200000800100 +:102530000121000100007307010D02F1EC560300B8 +:10254000000001000699E0A00AD7BB08E0A00C1D1E +:10255000FAE80010E0A00B04FAEB0010ECE20038FF +:102560006E1CE0A00C9B04980699E0A00AC5BB1B5A +:102570006E1CE0A00C9304980699E0A00ABDBB086D +:10258000E0A00C03FAE80018E0A00AEAFAEB001851 +:10259000ECE200406E2CE0A00C8104980699E0A0CB +:1025A0000AABBB1B6E2CE0A00C7904980699E0A046 +:1025B0000AA3BB08E0A00BE9FAE80020E0A00AD0DB +:1025C000FAEB00202FF06D6C1830CA85E0A00CCB20 +:1025D00014961697FAEA00100C980E99E0A00C12C7 +:1025E000FAEB0010FAEA00180C980E99E0A00C0A19 +:1025F000FAEB0018FAEA00200C980E99E0A00C0201 +:10260000FAEB00203007C0F8FACCFFF0F8070232EE +:10261000089A0A9B04980699E0A00C60C0320494C2 +:1026200006952FF7403C1837CF0563176326E2EA7B +:10263000002C08980A99E0A00C4FC0E30E36C04465 +:10264000301CFB6C00B3A1001302F1EC5604012115 +:1026500000008001012200010000E6CC010D02F122 +:10266000EC560300000001000008300CE34C00446D +:10267000E2EA00342D41A31BCDAA0E36C084302CD3 +:10268000FB6C0008E2EA003CE2EB002C2BC1620C80 +:102690002FFC830CCCCAD70380013370800133BC7C +:1026A000800133F88001343480011D38800117F037 +:1026B00080011A60800133A480013A54800136B051 +:1026C000800139428001371880013B1E800139BCEE +:1026D00080013A9480013A90D5313005E0673E6040 +:1026E000EA1700003003EF4300F0EF4300F4EEFC84 +:1026F00001002FFCEF4C0100401C581CC051EF435F +:1027000000ECEF4300E8EEFC00FC58ACC52431EAD5 +:10271000300BEEFC0104E0A0087BEF4C010831EA2D +:10272000301BEEFC0104E0A008731894EF44010C88 +:10273000EEFC00FCEE0C0020EEFB0100F60B10148A +:10274000E14B008C581CC305EEF20108640C680BC9 +:10275000FEB0FA8418918FB1641C681BFEB0FA7E3B +:1027600018968FC6642C682B0008FA001302F1EC4F +:102770005604012200008001012300010000597766 +:10278000010D02F1EC56030000000100FEB0FA78E2 +:10279000189B8FDBFEB0FB3818940C9C0C9BFEB092 +:1027A000FB331896029C029BFEB0FB2E0C9BFEB0E6 +:1027B000FAD5089BFEB0FAD2E14C0064E0FB008C35 +:1027C000E0FC0088181BE14B00B0EEFC00FC2FFC85 +:1027D000EF4C00FCEEFB010058ABC044303CEF4C2A +:1027E00000F8EEFC00FC58ACE0850157EEFC00FC64 +:1027F000201CEF4C00FCEEFC010458AB31EA30AB7E +:10280000C211E0A00823EF4C005C31EA30ABEEFCD3 +:102810000104E0A00839EF4C006031EA30ABEEFC77 +:102820000104E0A0084FEF4C006430065896C3C482 +:10283000EE06002C79AC0A9BFEB0FA9018952FF6A4 +:10284000CF6BE0A007F71896EF460110EEF50108F0 +:102850006F7C6C0BFEB0FA146A0BFEB0FA7FEF4C83 +:10286000005C6F8C6C1BFEB0FA0B6A1BFEB0FA7634 +:10287000EF4C00606F9C6C2BFEB0FA026A2BFEB02E +:10288000FA6DEF4C0064EEFC00FCEE0C00FAB400B4 +:102890001302F1EC56040123000080010124000121 +:1028A00000004D5F010D02F1EC5603000000010035 +:1028B00000266D9B6D8CFEB0FA636D7BFEB0FA60F6 +:1028C000FC1B4040FEB0FAB218956F7CFC1B412007 +:1028D000FEB0FB2018968FE66F8CFC1B4120FEB0EB +:1028E000FB1918948FF46F9CFC1B4120FEB0FB1267 +:1028F000EF4C0040EEFB010058ABC071EF460050BA +:10290000EF440054EF4C00583006C10831EAEC0B9C +:1029100011095C8BEEFC0104E0A0079EEF4C011452 +:102920006F696F5A6F4BC21D2FF658A6CF05E06432 +:102930003F7CEA1400006E9CEEFB00F0163CC5A440 +:10294000680C580CC101EEFC008CEF4C00D8301C18 +:10295000890C6EECEF4C00506EFCEF4C00546F0C89 +:10296000EF4C00586EACEEFB00F4163CC144681C02 +:10297000580CC121EEFC008CEF4C00DC301C891C93 +:102980006EECEF4C00506EFCEF4C00546F0CEF4CB3 +:102990000058C0288913EEF6008CEEFC00D80C2CF1 +:1029A000EF4C00E86E0BEEFA00DC0C2A143BC0C2C0 +:1029B0000068F0001302F1EC5604012400008001CD +:1029C00001250001000027E7010D02F1EC5603008C +:1029D00000000100681A581AC09189238933EF4317 +:1029E00000EC301CEF4C00F8C678183BC0C2680CF5 +:1029F000581CC09189238933EF4300EC302CEF4CF5 +:102A000000F8C5A8EEFC00E01816EF4600EC303CDC +:102A1000EF4C00F8C5186EECEF4C00506EFCEF4C1C +:102A200000546F0CEF4C005889038913EF4300E802 +:102A3000EEF6008C682C580CC051EF4600E0301CBC +:102A4000892CEEFC00E00C2CEF4C00ECFC1B447AD3 +:102A50000A9CFEB0F9FD1892301BFEB0FB7BC072E1 +:102A6000FC1CC47A0A9BFEB0F9F318926E2BFC1C76 +:102A700041A0FEB0F9ED049BFEB0FB78C092683C2B +:102A8000580CC071EF4600E4301C893CC0288933E3 +:102A90006E1BFE7CFE0C180BEEFC00E418160C3BC3 +:102AA000C082683C581CC051304CEF4C00F8C04804 +:102AB000303CEF4C00F8300CC118EE0C002BF6FA4D +:102AC0000090F74A008C588CC08477BAF74A0068A7 +:102AD000F6FA00B8003D38001302F1EC5604012567 +:102AE00000008001012600010000B22C010D02F15E +:102AF000EC56030000000100F74A00B42FFC589C7C +:102B0000CEF5EEFC00F8581CC080582CC180583C13 +:102B1000C230584CC2E0D93AEEFC0118301B99BBC8 +:102B2000EEFB00E899CB302B99DB401C580CC2D14E +:102B3000302BEEFC0118E0A031CFD93AEEFC0118A1 +:102B4000301B99BBEEFB00E899CB304B99DB401C66 +:102B5000580CC1B1CEEBEEFC0118301B99BBEEFB5B +:102B600000EC99CB308B99DB401C580CC0E1CE1B9C +:102B7000EEFC0118301B99BBEEFB00EC99CB310B3E +:102B800099DB401C580CCD50D93AD703800133BC97 +:102B9000800133F880013434800118CC80011A6040 +:102BA000800133A480011C7C80011978800189DCBC +:102BB000EBCD40F81895149712966A0CFEB0F89673 +:102BC0001894E0633E60EA130000E74400446A1C86 +:102BD0000E9BFEB0F88B1897E74700486A2C0C9BB9 +:102BE000FEB0F8841896E746004C300B089CFEB007 +:102BF000FACFC052EE1480000012DF001302F1EC95 +:102C000056040126000080010127000100000D97F5 +:102C1000010D02F1EC56030000000100E7440044FE +:102C2000300B0E9CFEB0FAC6C052EE178000E7478C +:102C30000048300B0C9CFEB0FABDC052EE1680006E +:102C4000E746004C6717663B0E9CFEB0FAB3C0D255 +:102C5000672C664BFEB0FAAEC082673C665BFEB086 +:102C6000FAA9C0323016C0283006666B0E9CFEB042 +:102C7000FAA1C0D2672C667BFEB0FA9CC082673C8A +:102C8000668BFEB0FA97C032301CC028300CE6FBD1 +:102C900000F00C0BE74B00F0E6FB00F4180BE74BE1 +:102CA00000F4E3CF80F8D703800117F080011C9473 +:102CB000EBCD40F8205D1693300B504B503B502B22 +:102CC000501BE0673A60EA1700005813C0918F0B61 +:102CD000780B8F1B781B8F3B782C8F2CC7A8E06656 +:102CE0003A7CEA1600006C1C6C09129A201A6E0BD2 +:102CF000143BC1A431EA2FFB5C8BE0A005EF8F4CA5 +:102D000031EA6E0B2FFB5C8B6C1CE0A006058F6C10 +:102D100031EA6E0B2FFB5C8B6C1CE0A0004D1900A0 +:102D20001302F1EC56040127000080010128000184 +:102D300000009A7C010D02F1EC5603000000010036 +:102D4000061B8F5C6E062FF6C3E831EAC161F7D926 +:102D5000B010E0A005D58F4C31EA6C0B5C8B6C1C7D +:102D6000E0A005EC8F6C31EA6C0B5C8B6C1CE0A076 +:102D700006038F5C6C06C278F7D9B010E0A005B4EA +:102D80008D2C31EA300B6C1CE0A005AE18958D350A +:102D90006C246E4C680BFEB0F7CD6A0BFEB0F838B1 +:102DA0008F4C6E6C681BFEB0F7C56A1BFEB0F83026 +:102DB0008F6C6E5C682BFEB0F7BD6A2BFEB0F828F6 +:102DC0008F5C6C060C9CFEB0FA59189B6E4CFEB0E2 +:102DD000F8E98F1C0C9CFEB0FA51189B6E6CFEB08B +:102DE000F8E18F3C0C9CFEB0FA49189B6E5CFEB07B +:102DF000F8D98F2C6E286E396E1AFACBFFF8FACC00 +:102E0000FFF0C37C300C500C6E286E396E1AFACB72 +:102E1000FFFCFACCFFF4CCFC6E0C2FFC8F0C300CBA +:102E20008F1C8F3C8F2CE0A03069404B996B402B5E +:102E3000997B403B998B401B999B5823C040301B8A +:102E40000054AF001302F1EC560401280000800189 +:102E5000012900010000DAC7010D02F1EC56030060 +:102E600000000100E0A0306E2FBDE3CF90F8D70343 +:102E7000800133BC800133F880013434800133A4F5 +:102E8000800117F080011D3880011A60800189B827 +:102E9000800189DCEBCD40FE1893169114961292B6 +:102EA0001097300B0E9CFEB0F9A9C4120E9BEE1BBE +:102EB00080000C9CE0A0064AE064C1E6EA141A63B4 +:102EC000E065A5DCEA15404CE0A0087808980A996E +:102ED000E0A007EBFEB0F93CC3CDFEB0F9B3870C20 +:102EE0000E9C0E9BFEB0F7FC18970C9C0C9BFEB042 +:102EF000F7F70E9BFEB0F79EE0A00860E0A039DE79 +:102F0000FEB0F926189BEE128000049CE0A0061E7D +:102F1000E0A0085408980A99E0A007C7FEB0F91885 +:102F2000C18DFEB0F98F830CE3CF80FE301B0E9C69 +:102F3000FEB0F958C4F30E9B0C9CEE1C8000E0A080 +:102F40000605E064C1E6EA141A63E065A5DCEA154B +:102F5000404CE0A0083308980A99E0A007A6300882 +:102F6000E0698000009246001302F1EC560401294A +:102F700000008001012A000100004F0C010D02F148 +:102F8000EC56030000000100EA194066E0A0068A42 +:102F9000FEB0F8F0CF0CFEB0F967870C0E9C0E9BCC +:102FA000FEB0F7B018970C9C0C9BFEB0F7AB0E9BD5 +:102FB000FEB0F752E0A00814E0A03992FEB0F8DAB3 +:102FC000189BEE128000049CE0A005D2E0A0080847 +:102FD00008980A99E0A0077B3008E0698000EA19A8 +:102FE000C066E0A0065FFEB0F8C5CC5CEE1C8000B9 +:102FF000FEB0F93A830CE3CF80FE0000EBCD40F841 +:1030000018951693149612971094300B0E9CFEB0E0 +:10301000F907C1C20E9BEE1B80000C9CE0A005A826 +:10302000E0A007DEE068C1E6EA181A63E069A5DC03 +:10303000EA19404CE0A0074BFEB0F89CC9CCEE1C4E +:103040008000FEB0F9118B0CC278300B0E9CFEB0E4 +:10305000F8DBC2230E9B0C9CEE1C8000E0A00588D0 +:10306000E0A007BEE068C1E6EA181A63E069A5DCE3 +:10307000EA19404CE0A0072B3008E0698000EA190B +:10308000C066E0A0060FFEB0008AAC001302F1ECAF +:103090005604012A00008001012B00010000F0B756 +:1030A000010D02F1EC56030000000100F875C75C49 +:1030B000EE1C8000FEB0F8EA8B0C300B089CFEB0D2 +:1030C000F8C1C2B20E9C0E9BFEB0F72E18970C9C56 +:1030D0000C9BFEB0F7290E9BFEB0F6D0E0A0079245 +:1030E000E0A03910FEB0F858189B089CE0A00552EB +:1030F000E0A00788E068C1E6EA181A63E069A5DC89 +:10310000EA19404CE0A006F5FEB0F846C46CFEB0EB +:10311000F8BD870CE3CF80F8301B089CFEB0F88622 +:10312000C2930E9C0E9BFEB0F6FF18970C9C0C9B56 +:10313000FEB0F6FA0E9BFEB0F6A1E0A00763E0A099 +:1031400038E1FEB0F829189B089CE0A00523E0A018 +:103150000759E068C1E6EA181A63E069A5DCEA19D4 +:10316000404CE0A006C6FEB0F817C17CFEB0F88E59 +:10317000870CE3CF80F8D7038001371880011978D6 +:1031800080019D54800135E480013A548001394228 +:1031900080011BE880011CDCEBCD40E01897E06566 +:1031A000FFFFEA15C406FC16C4340C9B0071DF0057 +:1031B0001302F1EC5604012B00008001012C0001E8 +:1031C0000000E49F010D02F1EC5603000000010035 +:1031D000FEB0F83EC0D30E9C0A9BFEB0F845C082FC +:1031E000FC1C44340E9BFEB0F65B1897C3C80E9CC3 +:1031F0000A9BFEB0F82DC103E06BFFFFEA1BC3334F +:103200000E9CFEB0F831C082FC1C43B40E9BFEB095 +:10321000F6471897C2883015EA154407301BEA1B99 +:1032200043340E9CFEB0F814C0D30E9C0A9BFEB033 +:10323000F81BC082FC1CC3B40E9BFEB0F63118977D +:10324000C1280E9C0A9BFEB0F803C0D3301BEA1BBA +:1032500044340E9CFEB0F808C0620E9C0C9BFEB07D +:10326000F61F18970E9CE3CD80E0D70380011C7CED +:1032700080011C94800118CCB18CF9DCC001EC1CDD +:1032800000015EFC3009F40B0D0AA19AC0382FF939 +:10329000A19AE04A0100C0435C595889CF955C5916 +:1032A0005889C0353F8C5EFCF40B1601F40B010805 +:1032B000F7E8108BF7E911C9F3EA110999195EFDD6 +:1032C000EBCD40E018971696E1BC0000CD6F300BB7 +:1032D00000D2F9001302F1EC5604012C0000800129 +:1032E000012D000100008E27010D02F1EC560300B4 +:1032F00000000100E06A4278EA1A0000951B580CB1 +:10330000C020D3033FF58F95301B8F0BE06B0080FF +:103310008F0BC020D5038FB5303AE06B0280E06C94 +:103320004164EA1C8000E0A03F7FED3C000C580C9B +:10333000C040310C8F0C8F256C0A6C1B0E9CCB5F30 +:103340005B8CC0413F8CE3CD80E0E3CF80E0D703CE +:103350008001AC30EBCD40801897E1BC0000C9FF84 +:10336000C020D3033FFC8F9C8FBCE3CF8080000044 +:10337000D421201D18961697300C500C34BCE0A0B8 +:1033800037A330258D05E0644278EA1400008906F1 +:10339000680CCE1FE06A4288EA1A00006E3C952C49 +:1033A0006E4C954C3009B4898919680C301BEF3884 +:1033B00000085808C240990BE069008099099905F6 +:1033C000EF3900085C390E092F899519EF3900088B +:1033D0009539E06A0703892A6E0AA17AEF39000855 +:1033E000F5E9110AE81AA000993A6E0AA17A6E4925 +:1033F000F5E9110A005BDF001302F1EC5604012D20 +:1034000000008001012E000100001BEC010D02F103 +:10341000EC56030000000100E81AE001994AC0D808 +:103420009539E06A0701892A6E0AA17A6E49F5E9A1 +:10343000110AE81AE001993A682A998A8D0BD50396 +:10344000681C580CC0F1E0A001B9C0C1FECFFFFC60 +:10345000400B2FFB500B400CEE5C4240CF233FDC77 +:10346000C0E88D05681C5BCCC040681C5BECC031BB +:103470003FFCC05834BCE0A0375B300C2FFDD82295 +:10348000D431201D18951690149712961094300C74 +:10349000500C34BCE0A0372A30138B03E06C008062 +:1034A0008B0C30228B02E0614278EA110000830528 +:1034B000620CC63FE06C4288EA1C000099209947E4 +:1034C000300BB88B831BA176EDE71107620C5C54BF +:1034D000C080E816A8009936E817F8019947C04857 +:1034E000E817E0019937E06B0701832B622B998B7A +:1034F0009903D503621C580CC0E1C5FDC0C1FECFC5 +:10350000FFFC400B2FFB500B400CEE5C4240CF33D6 +:103510003FDCC0E88B02621C00E08B001302F1EC80 +:103520005604012E00008001012F00010000A45765 +:10353000010D02F1EC560300000001005BCCC0401D +:10354000621C5BECC0313FFCC05834BCE0A03702C9 +:10355000300C2FFDD8320000EBCD40F8201D18961E +:103560001697300C500C34BCE0A036D230158D05C7 +:10357000E06C00808D0C30248D04E0634278EA1307 +:1035800000008706660CC0BF300C871CE06B07028A +:10359000872BE06B4288EA1B0000B68CEF3C0008EA +:1035A000580CC0D0EF3C00085C3C0E0C2F8C971CD4 +:1035B000EF3C0008973CB6858737C0586E3C971C97 +:1035C0006E4C973C6E0BA17B6E4A2F870F8C180AAE +:1035D000F7EA110BE81BE0008D3B660C662B998B1C +:1035E0009905D503661C580CC0E1CF9CC0C1FECF25 +:1035F000FFFC400B2FFB500B400CEE5C4240CF33E6 +:103600003FDCC0E88D04661C5BCCC040661C5BECF4 +:10361000C0313FFCC05834BCE0A0369C300C2FFDBC +:10362000E3CD80F8EBCD40F81895169714961294D8 +:1036300034BCE0A0366D301C8B0CE06C00EBB100AC +:103640001302F1EC5604012F00008001013000014B +:103650000000B43F010D02F1EC5603000000010030 +:1036600000808B0C302C8B0CE0634278EA13000056 +:103670008705660CCA6EE06B4288EA1B0000300CBE +:10368000B68C871CE80C1518C1C0EF3C000C580C18 +:10369000C1806E0CA17CE81CA8008B3C6E0CA17C48 +:1036A0006E2AF9EA110CE81CB8018B4CC038FECF29 +:1036B000FFFC6A7CEDBC0003CFB2308C8BBCC0E851 +:1036C0006E0AA17A6E2CF5EC110AF5E410BAEF3C03 +:1036D000000C184AE81AA0008B3A6C0A6C295C545A +:1036E000089CC040ED38000CC0283008A17AF5E9EC +:1036F000110AF5EC10BAF5E810CAED3C000C184AB6 +:10370000E81AE0008B4AEF3C000C580C6E1CC170AC +:10371000972CC088EDBC0000C0526A5C762A14CC9D +:10372000972A6A7CEDBC00036A7CCF52EDBC000096 +:10373000C1C26A5C762A14CC972AC178971C6E2C79 +:10374000973CC0F8763C580CC0C06A7CEDBC0001C8 +:10375000C082761A153C971A8B6C763C201C973CDD +:10376000004373001302F1EC5604013000008001A5 +:10377000013100010000A082010D02F1EC560300AE +:10378000000001006A7CEDBC0003CEF2308C8BBCE3 +:10379000ED3C000C580C6C1CC0F0972C6A7CEDBC06 +:1037A0000004C2036A7CEDBC0000CF926A5C762AFA +:1037B00014CC972ACF4B971C6C2C973CC0F8763CC6 +:1037C000580CC0C06A7CEDBC0001C082761A153C62 +:1037D000971A8B6C763C201C973C6A7CEDBC0004ED +:1037E000CEF26A7CEDBC000AC072E06C04008BBCB7 +:1037F0003FFCE3CD80F86A7CE21C0300C0B06A3C69 +:10380000EC1C80008B3CE06C03008BBC3FFCE3CDE8 +:1038100080F834BCE0A035C2E3CF80F880019CD0B2 +:1038200080019D14E06C4278EA1C0000780C787CE2 +:10383000E21C00305F1C5EFCEBCD40FC1897169438 +:10384000E06C3C80EA1C00007806E0653C74EA15F8 +:1038500000006C3CFEB0F59E18926C0CFEB0F59A20 +:1038600018938E8CEE0C001C982CFEB0F5A9069BCC +:10387000FEB0F3026A0BFEB0F2FF049BFEB0F4341C +:10388000E06BF5C300E214001302F1EC56040131C1 +:10389000000080010132000100003549010D02F1F4 +:1038A000EC56030000000100EA1B411CFEB0F3BA15 +:1038B000890C6C4CFEB0F58018938E8CEE0C001CBD +:1038C000983CFEB0F58F18926C1CFEB0F575049B09 +:1038D000FEB0F2E46A1BFEB0F34F069BFEB0F41696 +:1038E000E06BF5C3EA1B411CFEB0F39C891C6C5CC9 +:1038F000FEB0F56218938E8CEE0C001C984CFEB056 +:10390000F57118926C2CFEB0F557049BFEB0F2C610 +:103910006A2BFEB0F331069BFEB0F3F8E06BF5C303 +:10392000EA1B411CFEB0F37E892C089B0E9CC03C18 +:10393000E3CF90FCEBCD40FC18971694E06C3C80F4 +:10394000EA1C00007806E0653C74EA1500006C3C57 +:10395000FEB0F53218926C0CFEB0F52E18938E8CDA +:10396000EE0C001C982CFEB0F53D069BFEB0F296C6 +:103970006A0BFEB0F293049BFEB0F3C8E06BF5C394 +:10398000EA1B411CFEB0F34E890C6C4CFEB0F514E2 +:1039900018938E8CEE0C001C983CFEB0F523189208 +:1039A0006C1CFEB0F509049B004484001302F1EC8A +:1039B00056040132000080010133000100008AF248 +:1039C000010D02F1EC56030000000100FEB0F27898 +:1039D0006A1BFEB0F2E3069BFEB0F3AAE06BF5C3F0 +:1039E000EA1B411CFEB0F330891C6C5CFEB0F4F69F +:1039F00018938E8CEE0C00178E4CFEB0F5051897C0 +:103A00006C2CFEB0F4EB0E9BFEB0F25A6A2BFEB0AB +:103A1000F2C5069BFEB0F38CE06BF5C3EA1B411CBC +:103A2000FEB0F312892CE3CF90FCD70380011D3840 +:103A300080011D0C800117F0800119789889F40924 +:103A40001900C0333009B80998892FF9B809988945 +:103A5000F4091900C033300AB80A988AF40A100C25 +:103A6000140C2FCCB709B928170818A85EFF00005E +:103A70009889122B5C8B580BC024140B5C8BF60BB3 +:103A8000100C160C2FCC5EFCEBCD40F81895169759 +:103A90001496300C30048A83C1185C835803C085A7 +:103AA000E60B100C0A0B761BFEB0F27820135C8339 +:103AB0005803C0340C9320132FF4EE041900CEE504 +:103AC000E3CD80F8EBCD40F81895169700913000C3 +:103AD0001302F1EC560401330000800101340001AF +:103AE00000009EDA010D02F1EC5603000000010017 +:103AF0001496300C30048A83C1185C835803C08547 +:103B0000E60B100C0A0B762BFEB0F25A20135C83E6 +:103B10005803C0340C9320132FF4EE041900CEE5A3 +:103B2000E3CD80F8EBCD40F8189516971496300C3D +:103B300030048A83C1185C835803C085E60B100CDF +:103B40000A0B763BFEB0F23C20135C835803C03472 +:103B50000C9320132FF4EE041900CEE5E3CD80F88A +:103B6000800118CCD431E02D07D418911A9CE06B59 +:103B7000BA7CEA1B8001E06907D4170A18AA204919 +:103B8000CFD1FC173FE0E0654000EA15407F300BE5 +:103B9000029CFEB0F3EDC4B3FC133F50301BEA1B94 +:103BA0003F80029CFEB0F3F01A90C192029CE0A00C +:103BB00002CB30080A99E0A0023E30080E99E0A03E +:103BC0000125E0A0030CE00C032CE0A00322300848 +:103BD0000699E0A00230FEB0F381C718FC1C3F80BC +:103BE000029BFEB0F2B7E0A002AF30080A99E0A055 +:103BF0000024D2001302F1EC5604013400008001CD +:103C0000013500010000F462010D02F1EC560300E1 +:103C100000000100022230080E99E0A00109E0A096 +:103C200002F0E00C032CE0A0030630080699E0A0A7 +:103C3000021414981699E06A2D18EA1A5444E06B9D +:103C400021FBEA1B3FF9E0A000BFFEB0F359C49886 +:103C5000FC1BBF80029CFEB0F39D1A93C1C3EE1102 +:103C60008000029CE0A0028230080A99E0A001F5E1 +:103C700030080E99E0A000DCE0A002C3E60C032CA3 +:103C8000E0A002D93008FC19BF50E0A001E6FEB068 +:103C9000F337C278FC1CBF80029BFEB0F26DE0A03F +:103CA000026530080A99E0A001D830080E99E0A01A +:103CB00000BFE0A002A6E60C032CE0A002BC300886 +:103CC000FC193F50E0A001C9E0682D18EA185444DF +:103CD000E06921FBEA19BFF9E0A000AAFEB0F310E9 +:103CE000FE3DF82CD832D703800136B080013AEA85 +:103CF00080013B1E80013942EBCD40C018971696DB +:103D0000301B0C9CFEB0F346C0830E9C0C9BFEB097 +:103D1000F233C3BF00EC11001302F1EC560401357D +:103D20000000800101360001000061A9010D02F1CF +:103D3000EC56030000000100E3CD80C0300B0C9C6A +:103D4000FEB0F346C2E20E9C0C9BFEB0F227189622 +:103D5000300B0E9CFEB0F3300C9CC123C28FE0A050 +:103D60000217E0682D18EA185444E06921FBEA19AB +:103D70004009E0A0006FFEB0F2D5E3CD80C0C17F66 +:103D8000E0A00206E0682D18EA185444E06921FB1F +:103D9000EA19C009E0A0005EFEB0F2C4E3CD80C025 +:103DA000301B0E9CFEB0F308C073E06C0FDBEA1C06 +:103DB0003FC9E3CD80C0300B0E9CFEB0F309C0724A +:103DC000E06C0FDBEA1CBFC9E3CD80C0E3CF80C04D +:103DD00080011A6080013A548001371880011BE885 +:103DE00080011C7C80011C94D021F7E92004C0478D +:103DF000EE198000C358A17BF7EA1004C041EE1908 +:103E00008000C7F85CFCA179F1E91004E08000E2D1 +:103E1000103AF20B1300C0825CDC16971496129BCA +:103E2000109A0E990C984ED50A3BC0C2D401C43CDE +:103E3000D402101AF609014B00B45E001302F1EC33 +:103E40005604013600008001013700010000DE1237 +:103E5000010D02F1EC56030000000100F7EA100426 +:103E6000C721D0225EFB5C2AE08100B30A39E083DF +:103E700000C3CAE8D021F7E92004C047EE1980004A +:103E8000CCDBA17BF7EA1004C4E05CFCA179F1E98A +:103E90001004E08000B1123BC07216971496129B7A +:103EA000109A0E990C984D650A3BC0E2D401C15C92 +:103EB000D402100AF609004BC4625D0B5D0AC022F1 +:103EC000A1AA2FF7C4085C2AE08100830A39E083A5 +:103ED0000093129B109AC8F8D401CC7CCD4CD4022C +:103EE0000E265E0CE046003FC1B2EC051120E04614 +:103EF0000020C0B2F0050944F2050945F0060A4861 +:103F0000F2060A490A48C088F2050944104412988A +:103F10003009F0060A485804C020A1A85EFCD4026B +:103F2000D743C5E85CFCA179F3E81004C0605D09E3 +:103F3000129B109AD0225EFB5D09A19C5D0B126B57 +:103F4000D0225EFBD401C5DCD4025807E08A0016FB +:103F5000E9DAC00BE0240400C0C3C04100671000D0 +:103F60001302F1EC56040137000080010138000112 +:103F7000000049F9010D02F1EC56030000000100B8 +:103F8000EDBA000BC082E0640800080A5C0BC03286 +:103F9000BFBB2FF7E04707FFC324C3485C372FF7A9 +:103FA000E0470036C2922F67EE051120E04700205F +:103FB000C0B2F4050946F6050945F4070A4AF607B2 +:103FC0000A4B0A4AC088F60509461446169A300B71 +:103FD000F4070A4AEDBA0000C0920C76C041EDBA6F +:103FE0000001C04230160C0A5C0B5D0B5D0AA17B20 +:103FF000C1483FFBC128300B300AC0F8489B300A4B +:10400000C0C8EDBB001FF7B70101AB9AF5EB115A21 +:10401000A17BAB9BF7E7115BA19C5D0BD0225EFB04 +:10402000FFE00000F60412005E0CE0440020C0C077 +:10403000E8051120F604094BF4050A450A4BF4047F +:10404000094A08175EFCF40412002E04149BF604BF +:10405000094B300A08175EFCF20412005E0CE044C3 +:104060000020C0C0E8051120F2040949F0050A4506 +:104070000A49F004094808165EFCF00412002E04F8 +:1040800000BEA2001302F1EC5604013800008001CA +:104090000139000100000942010D02F1EC56030054 +:1040A000000001001099F2040949300808165EFC6E +:1040B000F6071615AB6BF7EA135BAB7A5C37EFBB11 +:1040C000001FF7B700015C375EFC0000F206161512 +:1040D000AB69F3E81359AB785C36EFB9001FF7B65C +:1040E00000015C365EFCD021A17B5CFCA1795C0CFC +:1040F000103AF20B1300C07216971496129B109A86 +:104100000E990C984BC50A3BC242F3E81005C860F3 +:10411000D411CCFFC9AFCDBFCB2F0C07E02703FED6 +:10412000F4080640F6080642F4090644F609064A71 +:104130000202F403004A5C0B0404F405004A5C0B21 +:10414000004408743006F7B601FF0C4AD412C1FBD4 +:104150005C2AFE91FF62F3E81005FE91FF71C5CB6A +:10416000D021A17B5CFCA1795C0C4A350A3BC332AF +:104170000A39C382F3E81005C390F7EA1005FE90F0 +:10418000FF5FD401C96FC61FCA2FC79FD4020C1787 +:10419000FE37FC013376A19B5D0AA1995D08103AB8 +:1041A000F20B1300003ADB001302F1EC5604013964 +:1041B00000008001013A000100009C89010D02F11C +:1041C000EC56030000000100C043101AF609014B31 +:1041D0005CF45CF5EC140001A17A5CFB2016CF21A5 +:1041E000F7EA100B5C3B5CF45CF5089A0A9BA96B40 +:1041F000F7EA138BA96ACDDA5C2AFE91FF200A390F +:10420000FE93FF30C1BB5C28FE90FF1BC17BF7EA29 +:104210001005FE90FF14C17BFFE00000D021F80BD9 +:1042200015015CFC167BFE90FF0CEFDBC308E0473A +:1042300000FFC0F0A77B300A5C37EFBB001FF7B769 +:1042400000015C37FE37FC80D401C11FD402CFEAE5 +:10425000A96BFE90FEF9CF2AD233C028D433F5EBF8 +:10426000101CF9E9101C104C5E0DF9DBC28BEC1C24 +:1042700007FFC061F5EB10CCC030D0331C9FF9D9DB +:10428000C28BEC1C07FFC041F1E910CCCF71F7E9FC +:10429000200CEDBB001FC056C053103AF20B1300A8 +:1042A0001C9F1438F60913001C9F580B5E6D3209D1 +:1042B000C02831F9F9DBC28BE02C03FF5E3D123CD4 +:1042C000C0E2F80C111F1699009120001302F1ECC6 +:1042D0005604013A00008001013B00010000233236 +:1042E000010D02F1EC56030000000100AB7BBFBBE7 +:1042F000F7EA135BF60C0A4BA1795E2B5C3B5EFB85 +:104300003FFCA19CA17B5C0C5EFC189B580B5F5C86 +:10431000C0245C3B300A580B5E0BD021E067041EC2 +:10432000FE9FFE5A189B300CCF6B0000D7F1206D1A +:10433000109A129BFAEB0010300C503CFACBFFE0C5 +:104340001A9CE0A039DD1891E066A9B4EA16800154 +:10435000300BFACCFFF05D161897407C580CC0402B +:10436000300C407BB60C5807C081FAEA00283008B0 +:104370003009E0A03DD7C1A05801C1D79A0C581C04 +:10438000C1F1FAEA002030083009EA193FE0E0A064 +:104390003DC9C0C05817C141FAEA002030083009B1 +:1043A000EA19BFE0E0A03DBEC451300A300BEA1B61 +:1043B0003FF0CD595821C061FAEA0020CD095817C5 +:1043C000C6D55827C041FAEA0028CC993005EA152D +:1043D0008000F06300005811C2B1408CA17C40AC59 +:1043E000C0C3EDBC001FC042300A300B00A3A800C0 +:1043F0001302F1EC5604013B00008001013C000176 +:104400000000371A010D02F1EC5603000000010014 +:10441000CB89300A300BEA1B7FF0CB39EDBC001F93 +:10442000C0E35807C0613FFBFACCFFF05D16C04601 +:104430003003EA137FF0300A069BCA395807C0617F +:104440003FFBFACCFFF05D16C0263005300A0A9B10 +:10445000C9895817C0F140ACA17C9A0CC043581CC4 +:10446000CD94CD5B581CCD34300A300BEA1B7FF065 +:10447000C88940ACEDBC001FC0E35807C0A13FFB9A +:10448000FACCFFF05D16C057408CEDBC001FCDF399 +:104490003005CDDB322CE06B42B4EA1B0000970CF8 +:1044A0005807C0A13FFBFACCFFF05D16C057408C07 +:1044B000EDBC001FCC133003EA137FF0CBDB408C44 +:1044C000A17CC0F25807C0D7321CE06B42B4EA1B93 +:1044D0000000970C3FFAE06BFFFFEA1B7FFFC51956 +:1044E000FAEA002030183009FEB0FEDCC033300C90 +:1044F000C0B8FAEA0020EE1B8000FAEB00203FFB78 +:10450000FACCFFF05D16BA1C9A0C581CC1E1FAEA0D +:1045100000BF10001302F1EC5604013C00008001C2 +:10452000013D000100005DA2010D02F1EC56030007 +:10453000000001000020E0683BCDEA18667FE069DA +:10454000A09EEA193FE6FEB0FEC1C112300730025C +:104550003003EA133FF0FAE80020300A300BEA1B80 +:104560004000FEB0FE0AFAEB0020C248FAE8002044 +:10457000300A300BEA1B4050FEB0FDFF3008300916 +:10458000EA193FE0FEB0FCE4FEB0FECBF8C7002025 +:10459000220CFEB0FEE030083009EA193F90FEB070 +:1045A000FDEC30083009EA193FE0FEB0FCD114926E +:1045B0001693E06CC250EA1C8001A57718075037AB +:1045C000FAEA002004980699FEB0FC8E1494169521 +:1045D000FAE80020049A069BFEB0FCBA14981699DB +:1045E000089A0A9BFEB0FE0614901691149816992C +:1045F000FEB0FDC314961697FAE50020E0A0320E37 +:1046000014941695300A300BEA1B3FF00498069973 +:10461000FEB0FC6A30083009EA194000FEB0FDAD7A +:10462000BB2B0C9A0E9B08980A99FEB0FDA6FAE8DF +:104630000028FEB000D518001302F1EC5604013D2D +:1046400000008001013E00010000C869010D02F177 +:10465000EC56030000000100FC59BB09FEB0FC8AC7 +:1046600000980299FEB0FD9BFAE80020FEB0FC82A3 +:1046700014961697E06239EFEA12FEFAE0632E42D2 +:10468000EA133FE604980699FEB0FDC6FAEB001067 +:104690009A0CFEB0FE72403CB908FEB0FC6BFAE822 +:1046A0000010FEB0FC67FAEB0010FAE80028FEB03C +:1046B000FD76FAEB000430083009EA19C0E0FEB0DC +:1046C000FE17C6D3FAEA000430183009EA1940E0B0 +:1046D000FEB0FE0CC672FAEA000430083009FEB0E3 +:1046E000FE07FAE80004300AC052300BEA1BBFE0B4 +:1046F000C048300BEA1B3FE0FEB0FC3CFEB0FE239E +:104700001895FAEA00280C980E99FEB0FD48FAEBCD +:104710000004403CF8E80008F8EA0010FEB0FC2A6B +:10472000FAE80028FEB0FD3B04980699FEB0FD377C +:10473000FAE80004FEB0FC1EFAEB00040A9CFEB08E +:10474000FE1CBB2B9A4CFEB0FE18405CB908FEB0B4 +:10475000FC11FAE80030FEB0004668001302F1ECEC +:104760005604013E00008001013F0001000077D2A5 +:10477000010D02F1EC56030000000100FD22BB090F +:10478000FEB0FBD604980699FEB0FD1BFAE80004C3 +:10479000FEB0FC02FAEB0004407C580CC030B805B7 +:1047A00030050A99300A300BEA1B3FF0FACCFFFCC7 +:1047B000E0A00F8A5C7C187CC040201CC050C1085F +:1047C000300A300BC058300A300BEA1B7FF0FAEB8E +:1047D0000004322CE06B42B4EA1B0000970C9A1CD8 +:1047E000580CFAEA0004C030EE1B80002FAD1B0EFF +:1047F0002FBDD0325EFCD7038001AF108001B734EB +:104800008001A1E4800139BC80013A9080013A9492 +:1048100080013AEA80013B1E800136B080013942B6 +:104820008001371880015E48D401300CFEB0FDC80D +:10483000D8020000D401E0A03427E06C00AAEA1CF2 +:104840000000305BB89B300BB88BB8CBB8DBE06CAA +:10485000246CEA1C0000FACBFFFC3249170A18AAA4 +:104860002049CFD1309A300B300CE0A00A29582CC7 +:10487000C031302CD802DA0A80015440003D1500C6 +:104880001302F1EC5604013F0000800101400001D9 +:10489000000076BA010D02F1EC56030000000100A1 +:1048A000D401CAFDD8020000EBCD4080E06700AA29 +:1048B000EA170000EF2C0001585CC0A1C26DC200D5 +:1048C000304CAE9CE0A033F2C54DE3CD8080584C17 +:1048D000C171CEBCC0A0303CAE8C305CAE9CE0A0C0 +:1048E00033E5C8FDE3CD8080CBEDC0A0302CAE8C8D +:1048F000305CAE9CE0A033DAC84DE3CD8080E3CFDE +:104900009080D7038001A808D401E0A03CE7E06BC9 +:104910002468EA1B0000970CE06B3FB8EA1B80019B +:10492000F94B0128E06B4000EA1B8001F94B012C98 +:10493000E06B4008EA1B8001F94B0130E06B40BCA2 +:10494000EA1B8001F94B0134E06B416CEA1B8001EA +:10495000F94B0138DA0AD7038001BA38300CE06B22 +:1049600000AAEA1B0000300AB6BAE06A2468EA1A14 +:104970000000740AF53A0121580AC0215EFDF72AA9 +:104980000000580AC040302CB6BC301CF72A000486 +:10499000581AC061F72C0003A3ACB6BC301C5C6C89 +:1049A00000DB2C001302F1EC5604014000008001F2 +:1049B0000141000100001A16010D02F1EC5603003E +:1049C000000001005EFC0000E06C00AAEA1C000090 +:1049D000300BB88BB8BBB8CB5EFF0000EBCD40808E +:1049E00020AD18971A9CE0A03B4B401C0E3CC043E6 +:1049F00018275C57C048280C18275C570E9CFEB03F +:104A0000EDE9406BFEB0EC1CFEB0FC882F6DE3CDF1 +:104A10008080D70380011D0C8001197880013A54F1 +:104A2000301CE06B00AAEA1B0000B6CC5EFD000063 +:104A3000D401E06A00AAEA1A0000F5290003EDB9E2 +:104A40000001C1C230191788F0081068F8080B0976 +:104A50001788F00810681808B09930991788F0087E +:104A600010681808B0A9F52900001788F008106828 +:104A70001808B0C917892FF9B689F5290003EDB9CF +:104A80000002C23230191788F0081068F8080B09C4 +:104A90003038178EFC0E1068180EBC983098178EA0 +:104AA000FC0E1068180EBCA81788F00810681808CB +:104AB000B0C92FFAF5290000178AF40A1068140CFF +:104AC000B8D9178C003C7B001302F1EC560401416D +:104AD000000080010142000100008FDD010D02F1A4 +:104AE000EC560300000001002FFCB68CC80FD80A5A +:104AF000EBCD408020FD3007300CFB6C000CFACC75 +:104B0000FFF0E0A0098DE06C246CEA1C0000FACBF9 +:104B1000FFF0760950097619501976295029FAC9FB +:104B2000FFF498CBF60A107DA37A98BBF60B107DA4 +:104B3000A37B98ACF80C107DA37CFEB07C31582C84 +:104B4000C02130170E9C5C6C2F1DE3CD80800000CF +:104B5000EBCD408020FD3007300CFB6C000CFACC14 +:104B6000FFF0E0A0095DE06C246CEA1C0000FACBC9 +:104B7000FFF0760950097619501976295029FAC99B +:104B8000FFF498CBF60A107DA37A98BBF60B107D44 +:104B9000A37B98ACF80C107DA37CFEB07C01581C64 +:104BA000C02130170E9C5C6C2F1DE3CD8080D70395 +:104BB0008001553480003AB4EBCD40E0220D30172F +:104BC000300CFB5C0054FB6C002D30ABFB6B002EFB +:104BD000FB6C0030FB6C0031E06600AAEA160000B6 +:104BE000ED2C0005580CC2A1008F8E001302F1ECD1 +:104BF00056040142000080010143000100003066BC +:104C0000010D02F1EC56030000000100E06C00B45D +:104C1000BACC346CBADC3015BAE5300CFB6C002C25 +:104C2000303CFB6C002DFACCFFD01A9B3249170A9E +:104C300018AA2049CFD1FACCFFD41A9B32C9190A3D +:104C400016AA2049CFD1E0A00943C0313027C0883F +:104C5000FACCFFA8E0A03A38417CACACACD50E9CB5 +:104C60005C6C2E0DE3CD80E08001B7B8EBCD40E069 +:104C7000216D3017E06600AAEA160000ED2C000551 +:104C8000581CC2013005FB550054FB65002D30ACAB +:104C9000FB6C002EFB650030FB650031301CFB6CAB +:104CA000002C303CFB6C002DFACCFFD41A9B32C98F +:104CB000190A16AA2049CFD1E0A0090AC02130372D +:104CC000ACD50E9C5C6C2EADE3CD80E0800155C070 +:104CD000EBCD40B03007E06C00AAEA1C000019AC34 +:104CE000CA2E14941695E06C246CEA1C00002F6CFC +:104CF000198CFEB0FBA914981699089A0A9BFEB06D +:104D0000FB4FC02330170E9C5C6CE3CD0094740005 +:104D10001302F1EC5604014300008001014400013C +:104D20000000244E010D02F1EC56030000000100CA +:104D300080B0D70380013B3880013A90D401201D18 +:104D4000E06CD134EA1C80011A9B198AB68A199A40 +:104D5000B69A19ACBAAC3018FAC9FFFE300A318BDA +:104D6000302CFEB096591BACE04C0048C19130ACE1 +:104D7000BA8C311CBA9C30291A9A318B302CFEB077 +:104D8000961FC0312FFDD80230ACBA8C300CBA9CC3 +:104D900030291A9A318B302CFEB09612CF4B300C42 +:104DA000CF2B0000D401201D1A9C300BB88BB89B70 +:104DB00030ACBA8C311CBA9C30291A9A318B302C09 +:104DC000FEB095FE2FFDD802D401201D1A9C300B99 +:104DD000B88BB89B30ACBA8C300CBA9C30291A9A7C +:104DE000318B302CFEB095EC2FFDD802D401201D64 +:104DF0001A9C300BB88BB89B30ACBA8C300CBA9C78 +:104E000030291A9A318B302CFEB095DA2FFDD8025A +:104E1000EBCD4080201D1897E06CD13AEA1C800150 +:104E20001A9B198AB68A199AB69A19ACBAAC301874 +:104E3000002C64001302F1EC5604014400008001D0 +:104E40000145000100004EF6010D02F1EC56030091 +:104E500000000100FAC9FFFE300A318B302CFEB091 +:104E600095ED1BACE04C0048C22130ACBA8C31FC53 +:104E7000BA9C30291A9A318B302CFEB095B3C041C0 +:104E80002FFDE3CD808030380E99310A318B302CE4 +:104E9000FEB095D4CF6030ACBA8C300CBA9C3029BF +:104EA0001A9A318B302CFEB0959DCEBB300CCE9B28 +:104EB000EBCD40C0203D1897E06CD024EA1C800167 +:104EC0001A9A1989B4891999B4992FCCB908FAE9B1 +:104ED00000042FEBF1DBC008FAC9FFFC302A318B4C +:104EE000302CFEB095AB1896E06C08F4EA1C00007C +:104EF0001BCBB88BFB3B000BB89B1BDCAE8C1BECBD +:104F0000AE9C1BFCAEACFB3C0008AEBCFB3C0009FD +:104F1000AECCFB3C000AAEDC30ACBA8C311CBA9C87 +:104F200030291A9A318B302CFEB0955C5806C0306F +:104F30000C9CC028300C2FDDE3CD80C0EBCD40C0F1 +:104F4000201D1897E06CD131EA1C8001FACBFFFFDD +:104F5000198AB68A008C27001302F1EC5604014529 +:104F600000008001014600010000DB3D010D02F15F +:104F7000EC56030000000100199AB69A19ACBA8CDD +:104F8000FEB093D4189630181A99300A318B302C11 +:104F9000FEB095661B8BE04B0048C26130ACBA9CFA +:104FA00031FCBAAC3029FACAFFFF318B302CFEB08D +:104FB000952B30ACBA9C300CBAAC3029FACAFFFF42 +:104FC000318B302CFEB09520301B0C9CFEB096B27D +:104FD00030181A9930AA318B302CFEB095411B8CB9 +:104FE000AE8C301CC048E06B00FFAE8B2FFDE3CDD4 +:104FF00080C00000EBCD40FC207D1893E06BCE100C +:10500000EA1B8001FACAFFF4169C2FCCB909B52817 +:10501000B909B5281A9C178AB88A179AB89A2ECB5C +:10502000B70AFAEB00043056FEB09380189530189A +:10503000FAC9FFF4300A318B302CFEB09511FB3CDD +:10504000000CE04C0048E081009830ACBA8C30078E +:10505000BA9730291A9A318B302CFEB094D5189219 +:10506000C051049C2F9DE3CD80FC30BCBA8C301C19 +:10507000BA9C30291A9A318B006726001302F1EC92 +:1050800056040146000080010147000100006486CB +:10509000010D02F1EC56030000000100302CFEB0BF +:1050A00094C51892CF10301B0A9CFEB0965530CC98 +:1050B000BA8C340CBA9C30291A9A318B302CFEB041 +:1050C00094B51892CE1030ACBA8C318CBA9C302981 +:1050D0001A9A318B302CFEB094A9189230AB0A9CEE +:1050E000FEB0963A5802CD00302B0A9CFEB0964096 +:1050F0003018FAC9FFF4302A318B302CFEB094C23C +:105100001892FB3C000CEDBC0000C0730C9CFE36FA +:1051100000015C7CCEA130065802CB603068FAC931 +:10512000FFF4303A318B302CFEB094AC1892CAC0E8 +:10513000FB3B000DA96BFB3C000C180BBA2BFB3C96 +:10514000000FA96CFB35000E1805BA35FB3C0011A9 +:10515000A96CFB3400101804BA4430CCBA8CBA974E +:1051600030291A9A318B302CFEB094601892C8C046 +:105170009A2CA94CA68C9A2CA69C5C85EA0C140847 +:10518000A6ACA6B55C84E80C1408A6CCA6D45C76C4 +:105190005816FE95FF7A3012C77B300200D4B60055 +:1051A0001302F1EC560401470000800101480001A0 +:1051B0000000F36D010D02F1EC5603000000010048 +:1051C000C75BD70380006DB0800073B8800073D0D8 +:1051D000800070E48000708CD4011699149B300A12 +:1051E000203CC040201CC060C088129CC5AE189AEC +:1051F000C048129CCDAE189A149CD802208D1A9CDF +:10520000E06BCD64EA1B8001320AB709B928208A15 +:10521000CFD11A9CFE6B000C760BF7DBC004F80BA9 +:10522000051CAB6C2F8D5EFCFE6A00007409A7C9DB +:10523000340BF7EC006C124C950C5EFDD401E06B66 +:10524000E1C1EA1B00E4163CC123E06BC381EA1B09 +:1052500001C9163C301CC062CE8F3FFB311CC1DC43 +:10526000D80ACE3F3FFB310CC18CD80A300CCDDFC1 +:105270003FFB311CC12CD80AFE6C0008780CF9DC0D +:10528000C0015EFCD401CF9FCFF0D80AFE6C0008AD +:10529000780CE21C000C5EFCEBCD40E018961697F3 +:1052A000E0650544EA150000F0150000FE6C0004FE +:1052B000780BE01BFFC0EDD6C00616460C9B5807C6 +:1052C0000009AA001302F1EC560401480000800115 +:1052D000014900010000B3D6010D02F1EC560300B4 +:1052E00000000100C0B5E01B00FFE41BFF00A96740 +:1052F000EFD7C110A96716470E9BF7DBC018EA1B52 +:10530000A500990BCD6F8B1CF0150000E3CF80E05A +:10531000D4013FFB303CFEB0FFD3D80AFE6C00083E +:10532000780CA59CF9DCC0015EFC0000D401189B40 +:1053300030CCFEB0FFC5CF3FD8020000EBCD40E03F +:1053400016973016189B302CFEB0FFBA5C57C0C0C1 +:10535000E0670544EA1700006E153FFCCE8F1896F3 +:105360006E1C18458F150C9C5C5CE3CD80E0000042 +:10537000D401189B301CFEB0FFA3D80AD4013FFB18 +:1053800030FCFEB0FF9DCCBFD8020000EBCD4080CA +:1053900018973FFB30ECFEB0FF935C57C030CEFF58 +:1053A000C028301C580C5F1CE3CD8080D4013FFB2B +:1053B00030DCFEB0FF85D80AD4011698F1EB108BD3 +:1053C000C02CD802D4011698F1EB110BC02CD802D6 +:1053D000EBCD40C01696F1D9C00814990C9A300B49 +:1053E0000C970E4B006A22001302F1EC560401499F +:1053F00000008001014A00010000261D010D02F19C +:10540000EC56030000000100C04CE3CD80C000005A +:10541000D631204D1494169512961091E06CD0CC94 +:10542000EA1C8001B90AFAEB00083003FC1780007F +:10543000FEB0FF0A18920E0240570E9BF7DBC00326 +:10544000201BF7DBC003C0C8FACCFFF8160CB884E9 +:10545000A984E9E51184A985201BF7DBC003580462 +:105460005C25CF310E06FC1C80001837C042FC17AB +:105470008000C0980437C073FC1C80801837C0328D +:10548000FC178080E06C0101EA1C80801836C06344 +:10549000FC168080FE36FF00C098301CEA1C80801D +:1054A0001836C0420C32C02204960C95A1C5E015F6 +:1054B000FFFCE015FFF8C0C8E20C1518C050300C16 +:1054C000C78F681C1843C85F069C68131843E064C4 +:1054D0000544EA1400000C37C702C2DF681C1843F9 +:1054E0000E98E018FF00109CFE3CFF00EA0C0D4CEB +:1054F0000C9BE01BFF0016385F29FAEA0008BB1B73 +:105500000E9B5C5BC1F0C028009999001302F1EC7E +:105510005604014A00008001014B0001000099A6D9 +:10552000010D02F1EC560300000001002F880E9AD5 +:10553000E01AFFF81438CFB30E9EFDDEC003C14061 +:10554000300BC06811371A901600A0872FFB1C3B48 +:10555000CFA314970A37C082400B0EAB401B0EAB93 +:10556000FAEA0008BB1BA39CEE0B1603182BC068BD +:10557000402C0EAC403C0EAC201B580BCFA15C590C +:10558000C1700C980C9BF7DBC003C0F0C068113CE5 +:105590001A9A160AB48C2FFB588BCFA3400C0EAC72 +:1055A000401C0EACC0282F88109C5C5CCFD1301CF6 +:1055B000EA1C80801837C932E20C1518C060300B25 +:1055C0003FFCCE1E681C18433FFCCF7E069C681330 +:1055D00018430437C8F3FC178080C8CB8913405C9C +:1055E0002FCDDC32EBCD42FF202D189014973003E5 +:1055F00000961692FC1C808018305F210C955C553B +:105600000C25C0683FFCCD9E069C68131843E064DF +:105610000544EA1400005807C350C9FE681C18432B +:105620003009C1585807C0900C35C07100F1960080 +:105630001302F1EC5604014B00008001014C000103 +:1056400000008D8E010D02F1EC56030000000100F8 +:10565000053B1A9AF40C0B0B2FF620172FF52FFC95 +:105660005C5C588CCF23BB0A0A9C208CB91B2F8909 +:10567000F9D9C010E04C0100C054AB0ABB1B300C80 +:10568000CF0BFB3C000F580CC0B05801C040300C91 +:10569000CB4EC048300B3FFCC88E681C18435801E5 +:1056A000CC40CBBECC4B8913009C2FEDE3CD82FFC9 +:1056B000E06B3F98EA1B0000F6FA00ECF60A002ABD +:1056C000F54C0078F6FC00EC2FFCF74C00ECF6FCF7 +:1056D00000EC585C5E3FF6FC00EC201CF74C00EC44 +:1056E0005EFD0000300CE06B3F98EA1B0000300AC2 +:1056F000F74A00F0F6FA00EC580A5E0D77EAF74A2E +:1057000000F0F6FA00EC201AF74A00ECC078F60C2C +:10571000002A75F9F54900782FFC584CCF955EFDAD +:10572000EBCD40803007E06C0104EA1C0000F93C3E +:1057300003B0E0A01E0FC038C62C2FF7E06C3F98D6 +:10574000EA1C0000298C198C1837CF73E3CF8080B6 +:105750000050D4001302F1EC5604014C000080010B +:10576000014D00010000E736010D02F1EC56030087 +:105770000000010080018900EBCD40E01697300663 +:10578000E0653F98EA150000EB3B008D169A2FFA72 +:10579000EB6A008DE04B0033C045300BEB6B008DA6 +:1057A000EB3B008C583BC215780BEB4B006C781B25 +:1057B000EB4B0070782CEB4C0074300CE0A01DD249 +:1057C000E06C0104EA1C0000F93B03B02FFBF96B0D +:1057D00003B0F93B03B0EB3A0068143BC053300B05 +:1057E000F96B03B0CB0FC91FEB3C008C189B2FFB50 +:1057F000EB6B008CE04C0065C045332CEB6C008CEF +:10580000EAFC00F0580CC070AE8C301658ACC031B9 +:1058100030ACAE8C5C560C9CE3CD80E0800188EC13 +:10582000EBCD40FC300C300AC0E8F40B1035A36B14 +:105830000E0B17C95809C06017E92E0BF6090F8B1C +:10584000164C2FFAE0670104EA170000583ACEE53B +:10585000E0A01DB2E0663F98EA160000E0A01DE857 +:10586000ED4C00E83005ED4500F03004C0588DB532 +:10587000789C8DCC0078D3001302F1EC5604014DD6 +:1058800000008001014E0001000072FD010D02F1D7 +:10589000EC560300000001002FF45834C454E80211 +:1058A0001035A3620E0205CC580CC2A0089CC5DCC2 +:1058B000ECF300E805ECE4CBFFE0F60C0F8B660C94 +:1058C000186BC17005ECE4CBFFCCF60C0F8C580CB8 +:1058D000C05005ECF60C0F8CC10F05EC2FFCA4ECAE +:1058E00005EC05DB163CC053640CEC04092CA4E564 +:1058F000670C580CC050660B670C184B870B58147C +:10590000CCC1EF3C00DAF80C101C0E0CF8FC011CAA +:105910008D9CECFC00E8789B2BABE04B008DCBA280 +:10592000788B8DBBCB8BECFC00E8780CE0A01D9A4B +:10593000EEFC03B4189B2FFBEF4B03B4E04C03E9E0 +:10594000C033EF4503B40C9CFE3CFF6C3509AD0B36 +:10595000B92A2089CFD1E3CF80FCD70380018940C9 +:10596000800189B8800189C8D4213007E0643F985C +:10597000EA140000E8FB00E8F7470040E06B010490 +:10598000EA1B0000F8091035A369160913E8F208AC +:1059900000256A8C582CC541009F74001302F1EC5D +:1059A0005604014E00008001014F00010000CD4669 +:1059B000010D02F1EC56030000000100F006101C7E +:1059C00012066D2C581CC4E1E8FE00E86D4C582C02 +:1059D000C0B17CDC583CC0646D7C2FFCED4C005C9D +:1059E000C038ED47005C6D4C584CC0B17CDC585C55 +:1059F000C0646D7C2FFCED4C005CC038ED47005C52 +:105A00006D4C588CC0B17CDC588CC0656D7C2FFC13 +:105A1000ED4C005CC038ED47005C6D4C590CC0B1DA +:105A20007CDC590CC0656D7C2FFCED4C005CC038F3 +:105A3000ED47005C6D7C6D3B314AF60A0C0A143C64 +:105A4000C0B47C0C6A8B168C9D0C6A8CE8FB00E859 +:105A5000F74C0040C078ED47005C7C0B6A8C184B1B +:105A60009D0B6A8C581CC641F00C101C180912962C +:105A70006D2CEDBC0000C5C26D3CEDBC0002C282C5 +:105A800069DCFC1BC080FEB0E665C362E8FB00E891 +:105A9000766AFE3AFF6FE04A0123C2E3767BF6CCDA +:105AA000FF6FE04C0123C2836D7C2FFCED4C005C4A +:105AB000E8FB00E86D7C585CC354760C001C600069 +:105AC0001302F1EC5604014F000080010150000167 +:105AD0000000DD2E010D02F1EC5603000000010074 +:105AE0006A8A148C970C6A8CE8FB00E8F74C00403B +:105AF000D82AEDBC0001C15269DC301BFEB0E63093 +:105B0000C0D3E8FB00E8766C2A6CE04C00B5C062BC +:105B1000767C2A6CE04C00B5CDA3ED47005CCDBB94 +:105B2000EDBC0004CD8269DCFEB0F506BFDBE068A9 +:105B30003334EA183333E0693333EA19401DFEB0D9 +:105B4000F519CEC3CC4BED47005C760A6A8C184A37 +:105B5000970AD82A80011C9480011C7C80013A5449 +:105B600080013A90D421203D3009E0683828EA18B5 +:105B700000007058300EC2185859C1D4F2071501F0 +:105B8000E0661F50EA160000F135000D1C15EC050B +:105B9000001520250B851A940E04A885F135000DFB +:105BA0001C15EC05001620160D861A950A07AE96F0 +:105BB0002FF95C592FFE5C6EF137000D0E3ECDD5EE +:105BC000581BC1955C6BC158F60810681808266808 +:105BD000118E585EC0C15859C0A41A9EFC09001EFF +:105BE00000EEE1001302F1EC5604015000008001C8 +:105BF000015100010000C993010D02F1EC560300B0 +:105C00000000010011A7BC8711B8BC982FF95C599E +:105C1000201B5C6B581BCEB4300CC148F80B1068CD +:105C2000140B3008B6883058B6A81A98F20C010E3A +:105C3000F00E00182028118EB6CE1198B6D82FFC81 +:105C40005C6C123CCEC5129C5C5C2FDDD82200003F +:105C5000EBCD40C0E02D0218189716961A9C300A1A +:105C6000300BB91BF8EB0008300CC188F80B10683A +:105C70000E0B17AA585AC100E06A3828EA1A000029 +:105C800017ABF40B0F8B2F3B178B580BC051301BEE +:105C90001A9A180AB48B2FFC5C6C0D8B163CCE75CF +:105CA000FACAFFF00D8B0E9CC70F300BC1F82FF90D +:105CB0005C6958E9C1941A9A120AF528000058083C +:105CC000CF71F20910680E093008B2883058B2A8B6 +:105CD000FACEFFF0F60810681C0811CEB2CE11D82B +:105CE000B2D83019B4892FFB5C6B183BC034300933 +:105CF000CE1B300BC228E0681E50EA180000F93EA7 +:105D0000000DFC0E004EF1001302F1EC560401519F +:105D1000000080010152000100005C58010D02F1F9 +:105D2000EC560300000001001006100EFD0E00D21C +:105D3000B22EF93E000DFC0E1006100EFD0E00D422 +:105D4000B23E2F3C198CF80C10061808F13C00D616 +:105D50002F89B28C301CB48C2FFB5C6B58ABE08469 +:105D600000E6E06C3828EA1C0000F80B032CF93A36 +:105D7000000D581ACF25585BCF003009C0382FF9D5 +:105D80005C6958E9CEA41A9A120AF528000058084E +:105D9000CF71F20910680E093008B288B2AB1698BC +:105DA0005898F9B802052FE8FE08001FC098C2589D +:105DB000C418C5D8C6E8CCFBCB1BC8C8CAC8E068A5 +:105DC0001E50EA180000F93E000DFC0E1006100EE1 +:105DD00028EE9C0EB22EF93E000DFC0E1006100EA1 +:105DE00028CE9C0EB23E2F3C198CF80C10061808D9 +:105DF00028A8900CB24CCAFBE0681E50EA180000BC +:105E0000F93E000DFC0E1006100EFD0E0092B22E93 +:105E1000F93E000DFC0E1006100EFD0E0094B23E71 +:105E20002F3C198CF80C1006005073001302F1EC93 +:105E30005604015200008001015300010000E3E319 +:105E4000010D02F1EC560300000001001808F10CEE +:105E50000096B24CC92BE0681E50EA180000F93ECB +:105E6000000DFC0E1006100EFD0E00B2B22EF93E13 +:105E7000000DFC0E1006100EFD0E00B4B23E2F3CBD +:105E8000198CF80C10061808F10C00B6B24CC75B60 +:105E9000E0681E50EA180000F93E000DF00E003ECA +:105EA0007D2E931E2F3C198CF00C00382B48900C43 +:105EB000B24CC63BE0681E50EA180000F93E000DE7 +:105EC000F00E003E208E9C0EB22EF93E000DF00E1C +:105ED000003E206E9C0EB23EF93E000DF00E003EDC +:105EE000204E9C0EB24E2F3C198CF00C003820280E +:105EF000900CB25CC42BE0681E50EA180000F93E1A +:105F0000000DF00E003E2E0E9C0EB22EF93E000D3E +:105F1000F00E003E2DEE9C0EB23EF93E000DF00E4E +:105F2000003E2DCE9C0EB24E2F3C198CF00C00384A +:105F30002DA8900CB25CC21BE0681E50EA1800004D +:105F40002F3C198C1808F13C00F7B2CC00A5650075 +:105F50001302F1EC560401530000800101540001CA +:105F60000000F7CB010D02F1EC5603000000010028 +:105F7000C16B300CC0282FFC5C6C58ECC0741A9BB1 +:105F8000F60C060A580ACF81AC8C300CC0B8300B26 +:105F9000E06A3828EA1A0000F40C032A2F3AB48B7E +:105FA0002FFC5C6C58ACCF45FE3DFDE8E3CF80C0D4 +:105FB000EBCD40FC203D169214963017F80B1518C7 +:105FC000C341E06C2138EA1C0000EC0515051805FA +:105FD000301CF80209448ABC086CC0D08AB3FAE3CA +:105FE00000045006E06CCB64EA1C8001FEB08DB664 +:105FF000302CC528301AEB2B0002F9D2B008E0A0F3 +:106000000949C1108ABB049AFAEB00045006E06CFF +:10601000CB64EA1C80012F0CFEB08DA08ABC184412 +:10602000AA34C388302CC388581CC341E06C213883 +:10603000EA1C0000EC0515051805301CF80209449F +:106040008ABC086CC0E18AB3FAE300045006E06C35 +:10605000CB64EA1C80012E0CFEB08D803037C1A8C5 +:10606000301AEB2B0002F9D2B008E0A00965C0E0BD +:10607000009454001302F1EC560401540000800116 +:106080000155000100009D73010D02F1EC56030063 +:10609000000001008ABB049AFAEB00045006E06C91 +:1060A000CB64EA1C80012D0CFEB08D6AC02830370D +:1060B0008ABC088CAA3C0E9C5C6C2FDDE3CD80FC76 +:1060C00080016720800167C4D401FEB0BF1BD802E5 +:1060D0008000D36CD401216D300AFB5A0054FB6A56 +:1060E000002D30A9FB69002EFB6A0030FB6A0031ED +:1060F000305AFB6A002CFB6C002DFB6B0030FACC95 +:10610000FFD41A9B32C9190A16AA2049CFD1C23C22 +:106110002EADD80AD401FEB0AB3FD80A8000AC0047 +:10612000D4015C5CFEB0AB4ED80AD7038000AC2C27 +:10613000300A599CC0D2E0692138EA190000A57CD8 +:10614000120C98BCF80B0A4CA19CC022301A149C6B +:106150005C6C5EFCEBCD40E020BD3017FB2B003CBF +:106160005C5B587BF9BB02072FEBFE0B001FC0885E +:10617000C318C448C6A8C898CB08CBA8CC48FB26EF +:10618000003DFACCFFC01A9B3249190A16AA2049D1 +:10619000CFD1FB2B008EC7001302F1EC5604015542 +:1061A0000000800101560001000008B8010D02F155 +:1061B000EC56030000000100003EF9D6B008FEB026 +:1061C000BAD9582CC0D10C9CFEB0BC283007500660 +:1061D000E06CCA38EA1C8001FEB08CE4CB18583C55 +:1061E000E08100AF5006E06CCA38EA1C80012F8CB9 +:1061F000FEB08CD8CA58FB26003DFB2B003EF9D6DA +:10620000B008FEB0BB65583CE081009B5006E06CD6 +:10621000CA38EA1C80012F0CFEB08CC4C918FB1BC5 +:106220000064FACCFFFCFEB0BC17FB2C0005582C18 +:10623000C111FB2C0004FEB0BBF13007FB2B0004A6 +:10624000500BE06CCA38EA1C80012E8CFEB08CAA80 +:10625000C778583CC751FB2B0004500BE06CCA3880 +:10626000EA1C80012E0CFEB08C9DC6A8E0A00E7C1E +:10627000582CC101FB26003D0C9CFEB0BBCF300763 +:106280005006E06CCA38EA1C80012D8CFEB08C8A66 +:10629000C578583CC551FB2B003D500BE06CCA380B +:1062A000EA1C80012D0CFEB08C7DC4A8FB26003DAD +:1062B0000C955855C131301C0066B6001302F1EC44 +:1062C0005604015600008001015700010000B70389 +:1062D000010D02F1EC56030000000100E0A00106F0 +:1062E000582CC1410C9CFEB0BBAB30075005E06C94 +:1062F000CA38EA1C80012C8CFEB08C66C338582545 +:10630000C311E0A03067582CCEE0583CC2B1500514 +:10631000E06CCA38EA1C80012C0CFEB08C55C228F7 +:10632000FACCFFC41A9B32C9190A16AA2049CFD148 +:10633000FEB0BC18C178FACCFFC41A9B32C9190A46 +:1063400016AA2049CFD1E0A02D75C0C8FB2B003D77 +:10635000500BE06CCA38EA1C80012B8CFEB08C34E8 +:1063600030070E9C5C6C2F5DE3CD80E08000CBB8E5 +:106370008000CD148000CE9C800173AC8001590C4C +:106380008000CE608001B7F48000CF848001B254D9 +:1063900080006FE8D401301CE06B249CEA1B0000F5 +:1063A000B68C305A300B300CFEB0FE3A582CC0314F +:1063B000302CD802305A305B300CFEB0FE31582CF5 +:1063C000CF80C73DE0A02CE6DA0A0000EBCD40C04C +:1063D0003017305A305B301CFEB0FE2200BBEF009D +:1063E0001302F1EC5604015700008001015800012E +:1063F000000020E8010D02F1EC560300000001004E +:10640000583CC0213037E066249CEA160000ED2C91 +:106410000000583CC030581CC091305A300B301C22 +:10642000FEB0FE10583CC0213037300CAC8CC4FD9F +:10643000E0A030520E9C5C6CE3CD80C0D401300CE7 +:10644000C66C582CC031302CD802583CC031303C7E +:10645000D802DA0AEBCD4080E0672490EA1700000A +:10646000E0A030EC8F2CE0A030EF8F0CFEB08AA2C1 +:106470008F1C6E2CE06B57B8EA1B8001F94B00A80B +:10648000E06B57F0EA1B8001F94B00ACE06B583C25 +:10649000EA1B8001F94B00B0E06B58C0EA1B800199 +:1064A000F94B00B4E06B5AE0EA1B8001F94B00B8ED +:1064B000E3CF90808001BA388001BA4480006DB08B +:1064C000D401300BE06A2490EA1A0000742AF53AED +:1064D00000A1580AC021D80A581CC031C0AC189B72 +:1064E000169C5C6CD8020000D401300CC0ACD80AF9 +:1064F000E06B24A2EA1B0000F72C00005EFC000009 +:10650000001CA2001302F1EC5604015800008001A7 +:106510000159000100006053010D02F1EC56030027 +:1065200000000100E06B24A2EA1B0000B68C5EFDB7 +:10653000EBCD40E0201D18953017E066249CEA164C +:106540000000ED2C0000581CC2E18C2C2FFCAC2C60 +:106550008C2CE04C004CC0D5300CAC2C302CAC8CCE +:10656000305A300B301CFEB0FD7F583CC021303714 +:106570005815C701E06C2490EA1C0000781C2BDC45 +:10658000198C581CC0A18C2C59FCC6452FF6ED2C3B +:1065900000002FFCAC8CC5E82FE6ED2C00002FFC92 +:1065A000AC8CC588582CC2515815C131E06C249070 +:1065B000EA1C0000781C2BDC198C581CC061ED2CE7 +:1065C00000012FFCAC9CC058ED2C00022FFCACACA1 +:1065D000ED2C0001581CC3E5305A300B300CFEB0D6 +:1065E000FD43582CC031302CC378303CAC8CC328D0 +:1065F000583CC301E06C42FAEA1C8000198CBA8C4A +:106600001A9BE06C2490EA1C0000780CE0A0094A78 +:106610005C5C582CC0E1305A300B301CFEB0FD24BD +:10662000583CC0210069C1001302F1EC5604015925 +:1066300000008001015A00010000F598010D02F1EF +:10664000EC560300000001003037301CC7EF304C1F +:10665000AC8CC128583CC101305A300B301CFEB004 +:10666000FD15583CC0213037300CAC9CACAC302C04 +:10667000AC8CE0A02BC50E9C5C6C2FFDE3CD80E0C4 +:1066800080016C7CD401301CE06B249CEA1B000070 +:10669000B68C305A300B300CFEB0FCF8582CC031A0 +:1066A000302CD802305A305B300CFEB0FCEF582C46 +:1066B000CF80C31CE0A02BA4DA0AD7038001B1B4B9 +:1066C000EBCD40C03017305A305B301CFEB0FCDEE2 +:1066D000583CC0213037E066249CEA160000ED2CBF +:1066E0000000583CC030581CC091305A300B301C50 +:1066F000FEB0FCCC583CC0213037300CAC8CC0BC58 +:10670000E0A02F0E0E9C5C6CE3CD80C08001544055 +:106710008001B8D4E06C249CEA1C0000300BB82B3C +:10672000B89BB8AB5EFD0000EBCD40801697301AE9 +:106730000F8BF60B1068F80B0B0A0F8BF60B10681B +:10674000180BB69A305B0F890079E6001302F1EC62 +:106750005604015A00008001015B000100004A2339 +:10676000010D02F1EC56030000000100F20910686F +:106770001809B2AB0F8BF60B1068160CB8CACEBE58 +:106780000F8C2FFCAE8CE3CF80800000D401E06C36 +:10679000D08CEA1C8001FEB08A5FE06C009CEA1C91 +:1067A0000000300BB88BB8BB301AB8CAB8DAB8EBF7 +:1067B000B8FBB89BFEB089342C0C988CDA0A000028 +:1067C000D401E06CD084EA1C8001FEB08A45FEB0A2 +:1067D00089272C0C988CEDBC0005C023DA0AE06CEC +:1067E000009CEA1C0000300BB88BB8BB301AB8CA4A +:1067F000B8DAB8EBB8FB19AA581ACF11B8AB30EA1F +:10680000308B301CFEB0FC54583CCE91303CD8024A +:10681000EBCD40C0E06C3828EA1C0000784B179B99 +:10682000785C19961606FEB088FB2C0C988CEDBC93 +:106830000005C033E3CF90C0E067009CEA1700007A +:106840000FBC580CC051301CAEBCE3CF90C00FAC95 +:106850005C56C090581CCEF1301CAECC300CAEACA7 +:10686000E3CF90C05C5CC1610FCC581C00A06600F7 +:106870001302F1EC5604015B00008001015C000191 +:1068800000005E0B010D02F1EC5603000000010058 +:10689000C08130EA308B301CFEB0FC1C300CAECC1A +:1068A00030EA308B300CFEB0FC15582CCD60301C1B +:1068B000AEACE3CF90C02FF7EF2C00005C5C187CEF +:1068C000C050202CC060E3CF90C0C0BCE3CF90C0CC +:1068D000C44CE3CF90C0D70380006DB0800154401A +:1068E000EBCD40E0202DE06C2114EA1C0000780C78 +:1068F0002A8C9807E065009CEA1500000BDC581C08 +:10690000C0A1E047002EC074300CAADC301CCBBC08 +:10691000300CCA9C8A460C37C1B5EB2C00072FFC03 +:10692000AAFCEB2C0007582CC155302CAA9C300C2B +:10693000AAFCBB17E06CD00CEA1C8001FEB0899E5B +:1069400033CCAA4C301CC9FC301CC8DCC038300C1D +:10695000AAFC2FEDE3CF90E0EBCD40E0202DE06CE2 +:106960002114EA1C0000780C2A8C9807E066009C31 +:10697000EA160000E047002DC194ED2C00062FFC24 +:10698000ACECED2C0006582CC1353005AC95301C14 +:10699000001DD1001302F1EC5604015C00008001DF +:1069A000015D0001000034B3010D02F1EC5603005B +:1069B00000000100C7AC300CC68CACE58C46BB17A0 +:1069C000E06CD018EA1C8001FEB0896AC038300C37 +:1069D000ACEC2FEDE3CF90E0EBCD4080E06CD064E9 +:1069E000EA1C8001FEB0895CE0672114EA17000010 +:1069F000E0A02E7E8F1CE0A02E818F0C300CE06B6F +:106A0000009CEA1B0000B69C6E1CE06B5B20EA1B3E +:106A10008001F94B01C8E06B5B54EA1B8001F94B24 +:106A200001CCE06B5BA4EA1B8001F94B01D0E06B69 +:106A30005DA4EA1B8001F94B01D4E06B5E00EA1B08 +:106A40008001F94B01D8E3CF9080D70380006FE835 +:106A50008001BA388001BA44D401300BE06A2114B5 +:106A6000EA1A0000741AF53A01C1580AC021D80A7E +:106A70005C6CC031C12C189B169C5C6CD802000069 +:106A8000D401300CC12CDA0A581C5F0CE06B211DBC +:106A9000EA1B0000B68C5EFDE06B211CEA1B0000C7 +:106AA000F72C00005EFC0000E06B211CEA1B0000DC +:106AB000B68C5EFD004FF4001302F1EC5604015D4C +:106AC00000008001015E00010000A178010D02F1CB +:106AD000EC56030000000100D401189A301C1789FD +:106AE000F2091068F4090B0C1789F20910681409EF +:106AF000B29C30EC1789F20910681409B2ACE06C52 +:106B0000211DEA1C0000F9290000178CF80C106800 +:106B1000180AB4C9178C2FFCB68CCC5FD80A0000B9 +:106B2000D671203D14901691B906E065B5A8EA1516 +:106B300080010C9A0E9B5D151893009A029B5D15BF +:106B40003005EA157FF05803C087580CC606582C4C +:106B5000C091404CB911C0385823CFA1302C2FDD43 +:106B6000DC72580CC1A10C9A0E9B30080A99E0A067 +:106B70002C4FC050404CB911300CCF2B321CE06B65 +:106B800042B4EA1B0000970C3FFAE06BFFFFEA1BE0 +:106B90007FFF404CB91BCE3B581CC0D13008F06978 +:106BA00000000C9A0E9BE0A02C33CE90404CB91103 +:106BB000301CCD6B5803C121404CB911405BE0A0A3 +:106BC0001DAB18935C7C202CC072322CE06B42B45D +:106BD000EA1B0000970C069C00D9BE001302F1ECE2 +:106BE0005604015E00008001015F000100001EC329 +:106BF000010D02F1EC56030000000100CC3B0C9AA1 +:106C00000E9B30080A99E0A02C15C0A1009A029BA7 +:106C100030080A99FEB0ED15404CB91BCDCB300AB7 +:106C2000300B00980299FEB0ED0C404CB91BCB7BA9 +:106C30003008E069C800EA19C09C0C9A0E9BFEB0AF +:106C4000EDA9CEE33018E069C800EA19409C0C9A1F +:106C50000E9BFEB0ED9DC113009A029B30080A996D +:106C6000FEB0ECEF404CB91B322CE06B42B4EA1B97 +:106C70000000970C301CC86BE06882FEEA18652B98 +:106C8000E0691547EA193FF70C9A0E9BFEB0ECD964 +:106C90001494169530083009FEB0ED7C300AC052CD +:106CA000300BEA1BBFE0C048300BEA1B3FE00898FE +:106CB0000A99FEB0EBB1FEB0ED98502CFEB0EDAFEE +:106CC00014941695E068E4F2EA18BCD5E069E8E7A8 +:106CD000EA193E4BFEB0ECB5BB2B300AEA1AF800BD +:106CE000E06B2E42EA1B3FE608980A99FEB0ECA939 +:106CF000149816990C9A0E9BFEB0EB5A00F0BF0048 +:106D00001302F1EC5604015F0000800101600001F4 +:106D1000000081A8010D02F1EC5603000000010003 +:106D2000BB09FEB0EB57149416953FE8E069FFFFEE +:106D3000EA19BC8FFEB0ED3EC0D330083009EA1925 +:106D40003C90089A0A9BFEB0ED37C042009A029B25 +:106D5000C688089A0A9B08980A99FEB0EC84149693 +:106D60001697E0682E11EA188157E0693FA0EA19EA +:106D70003F50FEB0EC78E0684358EA188C12E069A6 +:106D8000718FEA193FBCFEB0EB590C980E99FEB01A +:106D9000EC6A14921693E068E84BEA1841A5E069A2 +:106DA00052B7EA193F010C9A0E9BFEB0EC5CE0680A +:106DB000BD0BEA18DAF3E06970E8EA193F8CFEB01F +:106DC000EB3D0C980E99FEB0EC4E30083009EA19F4 +:106DD0003FE0FEB0EB3308980A99FEB0EC441496FD +:106DE00016973005EA153FF0049A069B0C980E9909 +:106DF000FEB0EAF030080A99FEB0EB20BB1B049A03 +:106E0000069B0C980E99FEB0EB1930080A99FEB05B +:106E1000EB15BB08FEB0EC6400980299FEB0EC23C1 +:106E20000005EE001302F1EC560401600000800141 +:106E30000161000100003D19010D02F1EC56030053 +:106E400000000100404CB91B402B405C180B404C2B +:106E5000E0A01C9818935C7C202CFE93FEEECF2AB9 +:106E60008001B73480013AEA80013B1E80013A90EC +:106E700080013A94800136B080013718800139BC16 +:106E80008001394280019A3CEBCD40C0189BE06CF8 +:106E90001320EA1C0000300A994AE06E1198EA1E9D +:106EA000000030599D39990A991A992A993A30085F +:106EB0003009F8E90014F8E9001CF8E90024F8E9C1 +:106EC000002CF8E90034F8E9003CF94A0044F94A9A +:106ED00000481C9A2E4A9D4A1C9A2E4A149632D774 +:106EE000AD282017CFE18D08BD199D287628EE1812 +:106EF00080007619EE198000760A189B2FCBFEB021 +:106F0000E3BBE3CF90C00000EBCD40FE1691E066FE +:106F10001198EA160000780B8D0B781BEE1B800091 +:106F20008D1B782CEE1C80008D2C31EA0C9B6C4C58 +:106F3000FEB0E8C26C39129A201A6C4CE06713203C +:106F4000EA1700000055A7001302F1EC5604016196 +:106F500000008001016200010000A8D2010D02F1D1 +:106F6000EC560300000001006E4B143BC23431EAC2 +:106F70002FFB5C8BFEB0E8D8FEB0EC22EEEB002CD1 +:106F800031EA6E4B2FFB5C8B6C4CFEB0E8EBFEB035 +:106F9000EC17EEEB003431EA6E4B2FFB5C8B6C4C44 +:106FA000FEB0E8FEFEB0EC0CEEEB003C6E462FF6B9 +:106FB000C6B831EAC1F1F7D9B010FEB0E8B5FEB0FD +:106FC000EBFFEEEB002C31EA6C3B5C8B6C4CFEB0C3 +:106FD000E8C9FEB0EBF5EEEB003431EA6C3B5C8BBC +:106FE0006C4CFEB0E8DDFEB0EBEBEEEB003C6C363B +:106FF000C4B8F7D9B010FEB0E88B8D5C31EA300B25 +:107000006C4CFEB0E88518958D656C546A0CFEB02A +:10701000EBD714921693680CFEB0EBD21498169925 +:10702000EEEA002CFEB0E9FA04980699FEB0EA2ACE +:10703000EEEB002C6A1CFEB0EBC314921693681C96 +:10704000FEB0EBBE14981699EEEA0034FEB0E9E605 +:1070500004980699FEB0EA16EEEB00346A2CFEB0F6 +:10706000EBAF14921693682C006AB3001302F1EC94 +:1070700056040162000080010163000100001769ED +:10708000010D02F1EC56030000000100FEB0EBAA76 +:1070900014981699EEEA003CFEB0E9D204980699DD +:1070A000FEB0EA02EEEB003C6C360C9CFEB0EBFF4F +:1070B00014981699EEEA002CFEB0EB481492169341 +:1070C000EEE300140C9CFEB0EBF214981699EEEA75 +:1070D0000034FEB0EB3B14941695EEE500240C9CB6 +:1070E000FEB0EBE514981699EEEA003CFEB0EB2EEC +:1070F000EEEB001CFEB0DC4018981096089A0A9B34 +:10710000FEB0DC3A18991295049A069BFEB0DC3466 +:107110000C980A99189A0E9B2F4B0E9C2F8CFEB040 +:10712000E2CF6E4C2FFC8F4C300A300BEEEB00148C +:10713000EEEB0024EEEB001C6E0B6E2CC32C1896AD +:10714000EF4600446E1B6E3CC2CCEF4C00482D86CF +:10715000E0460051C0522D8CE04C0051C053301C11 +:10716000A28CE3CF90FE300CA28CE3CF80FED7033D +:1071700080013370800133BC800133F880013434E6 +:10718000800133A480013A54800136B0008B860020 +:107190001302F1EC56040163000080010164000158 +:1071A00000000341010D02F1EC5603000000010054 +:1071B0008001371880013B1E800139BC80011BE82B +:1071C00080012930F80B010AE04A00B5C065162C91 +:1071D000FE3CFE985C3C5EFCFE5AFF4CC054FE3CFC +:1071E000FE98161C5EFC149C5EFC0000EBCD4080FB +:1071F000E067CCC4EA1780010E9CFEB085CF311A3F +:10720000307B300CFEB0F7F6582CC0812EC70E9C98 +:10721000FEB085C4302CE3CD8080E3CF90800000A9 +:10722000EBCD4080E067CD04EA1780010E9CFEB0F4 +:1072300085B5311A307B301CFEB0F7DC583CC0817C +:107240002EC70E9CFEB085AA303CE3CD8080E3CFF4 +:107250009080D70380015440EBCD40C0202DFEB07C +:1072600084811896E067CF64EA178001AF0ABB1BE0 +:10727000E06B212CEA1B0000761B2B0B1A9A14984A +:10728000308C173910C9201CCFD19AB99AAA9A9B71 +:107290009A8CC33CE04C2711C125301CED6C00C515 +:1072A0002BD60D8C581CC221364BE06C00FFFEB073 +:1072B000008F63001302F1EC5604016400008001AA +:1072C00001650001000069F9010D02F1EC560300AF +:1072D00000000100896B2F870E9CFEB08571C1886C +:1072E000C174ED3C00C5581CC131300CED6C00C5BB +:1072F0002BD60D8C580CC0C1E0A02A90300BF93C65 +:107300000082FEB089532F870E9CFEB085592FED69 +:10731000E3CF90C080006DB0800077D4D431189650 +:107320001695129430073003089CFEB0DBF11892DA +:10733000089CFEB0DBED049BFEB0DA0A18920A9CB2 +:10734000FEB0DBE618950C9CFEB0DBE20A9BFEB0BB +:10735000D9FF049BFEB0DA7018965854C765E067F1 +:107360003334EA173F330E9BFEB0DB80C1F30C9C35 +:107370000E9BFEB0DB6FC183E06B6666EA1B3FE6E7 +:107380000C9CFEB0DB73C102E06B3333EA1BBF33EE +:107390000C9CFEB0D987E06BBA2EEA1B3F68FEB0AA +:1073A000D9D71893C038FC133F80089CFEB0DBB0DF +:1073B000FEB0EA3C149416953008E0691CACEA195A +:1073C0003FF8FEB0ECDF14961697069CFEB0EA2E4E +:1073D0001490169100EB87001302F1EC560401653E +:1073E00000008001016600010000FC32010D02F185 +:1073F000EC56030000000100FC188000E069353FF6 +:10740000EA193FF0089A0A9BFEB0ECCEFC18A000E7 +:10741000E0697CEDEA193FF1FEB0E991009802992C +:10742000FEB0E98D14901691FC1C3F80069BFEB0C7 +:10743000D8DDFEB0EA0D14941695FC1A4000E06BFE +:10744000A92AEA1B3F430C980E99FEB0E9780898E8 +:107450000A99FEB0E974FEB0EA46FEB0EA5E009812 +:107460000299FEB0E857FEB0EA3E18970E9CD8325B +:1074700080011A6080011C7C80011C94800118CC62 +:107480008001197880011D3880013FAC800117F020 +:1074900080013A548001394280013B1E8001371837 +:1074A00080013AEAEBCD4080E06CCE6CEA1C8001B2 +:1074B000FEB08498E067212CEA170000E0A029BA0A +:1074C0008F0CE0A029BD8F1C6E0CE06B643CEA1BA6 +:1074D0008001F94B0228E06B6470EA1B8001F94BD4 +:1074E000022CE06B64A8EA1B8001F94B0230E06BD0 +:1074F000A92CEA1B8001F94B001F67001302F1EC75 +:107500005604016600008001016700010000438904 +:10751000010D02F1EC560300000001000234E06BA3 +:10752000A96CEA1B8001F94B0238E3CF9080D703A6 +:1075300080006FE88001BA388001BA44EBCD40FC8E +:10754000189716961495E06C3828EA1C0000F80786 +:10755000032430033022E93C000E580CC031E3CF45 +:1075600080FC099C580CC1B1F7D5B008089C68CACA +:10757000F01A0000C14068BC781C5D1C18935C5375 +:10758000C061049CFE32FF015C5CCF615803CE8079 +:10759000F7D5B008089C68CA741A5D1AF5D5B0080A +:1075A000F7D6B008089C68C972495D195C53C140A0 +:1075B000099C580CC111F7D5B008089C68CA742AF8 +:1075C0005D1AC04068BC782C5D1CF7D5B008089CDB +:1075D00068CA743A5D1AF9D7B008C97CE3CF90FC49 +:1075E000EBCD40FC189716961495E06C3828EA1CF1 +:1075F0000000F807032430033022E93C000E580C49 +:10760000C031E3CF80FC099C581CC1A1F7D5B0085C +:10761000089C68CA742A5D1AC0D068BC003A9600FB +:107620001302F1EC560401670000800101680001BB +:107630000000D462010D02F1EC56030000000100CD +:10764000782C5D1C1893E60C1518C061049CFE3262 +:10765000FF015C5CCF51F7D5B008089C68CA743A4A +:107660005D1AF5D5B008F7D6B008089C68C97259FC +:107670005D195C53C150099C581CC125F7D5B00851 +:10768000089C68CAF01A0000C0B068BC781C5D1C79 +:10769000CCB0F7D5B008089C68CA741A5D1AF9D73F +:1076A000B008C45CE3CF90FCD421189716961495CB +:1076B000E06C3828EA1C0000F8070324E93C000EBF +:1076C000580CC021D82AF5D5B008E805000C2EDCEE +:1076D000F92B0000089C68C972595D19F5D5B008EE +:1076E000F7D6B008089C68C972495D19F9D7B00887 +:1076F000C1ECDA2A5C5C586CF9BC02061E0C19EC71 +:10770000180F0A0E12161C22280030AC5EFC314CF9 +:107710005EFC33CC5EFCE06C00B45EFCE06C03C04D +:107720005EFCE06C27105EFC5EFD0000EBCD40E0EF +:1077300030673FF6300CC148149B120BF72800113C +:1077400000955C001302F1EC560401680000800112 +:1077500001690001000094D9010D02F1EC5603000B +:10776000000001005808C0955C670E38C064F72718 +:1077700000112EDBF72600002FF95C695829CEF5A1 +:107780002FFC5C6C58ACC094E06B3828EA1B0000FE +:10779000F60C032A3009CF3BF9D7B008CBEFE065F0 +:1077A0001FE4EA1500006A0BF75C006AF767006CDB +:1077B000F766006DF71A006EF80A1900C210F80A91 +:1077C0001510C090F71A0066580AC171F71A006EBA +:1077D000580AC131300AC0783009F60A001828E882 +:1077E000B0092FFA5C6A586ACF85F75C006E290BE6 +:1077F000B687FEB082ABC048301CE0A0283FE0A0B6 +:107800002843C1216A0CF91B006E581BC0D529AC56 +:10781000988C580CC091FEB0BA85E06CD0DCEA1CA4 +:107820008001FEB08315E3CF90E0D70380006EE4C3 +:107830008001BA148001BA208000DEBC80006FE8AD +:10784000E1BC0000D3035EFCB18CF9DCC001EC1C90 +:1078500000015EFCD401CF9FC020D503D80A0000F0 +:10786000D401201C003DA1001302F1EC5604016973 +:1078700000008001016A000100000112010D02F107 +:10788000EC56030000000100C060201CC070201CEA +:10789000C080D80AE0A01B92D80AE0A01BADD80A8D +:1078A000E0A01BC8D80AD7038001A1308001A16CD9 +:1078B0008001A1A8201CC080201CC0C0201CC0F0DA +:1078C000201C5E0F5EFDFE7C1814780CF9DCC001F4 +:1078D0005EFC486C780CF9DCC0015EFC484C780C0E +:1078E000F9DCC0015EFCD703FFFF1864FFFF1850EE +:1078F000EBCD40801897F9D7C008CDDFCFD0E3CFCC +:1079000080800000300B990B5EFD0000780AE01AC1 +:10791000E0FFF5EB108B990B5EFD0000780AE21A90 +:10792000FFFD990A582B5E3D780AA1BA990A780A98 +:10793000201BAF7BE61BFFFF144B990B5EFD000085 +:10794000780CA1ACFE7A1868F40B092C5EFD0000DF +:10795000300BFE7A1868F40C092B5EFDEBCD40E08D +:10796000189616951497300BCCEF0A9B0C9CCCFF05 +:107970000E9B0C9CCD4F362C8D1CE06CB400EA1C89 +:1079800004C48D2CE46C0004009981001302F1EC16 +:107990005604016A00008001016B00010000BEA9CD +:1079A000010D02F1EC560300000001008D3C300C8B +:1079B0008D4CE3CF80E00000FE7C1814780CA99C6D +:1079C000F9DCC0015EFC0000D401581CC060584CBA +:1079D000C0C0589CC120D80A301CC7FFC151301C00 +:1079E000C64F301CC98FD80A303CC77FC0D1303C4D +:1079F000C5CF303CC90FD80A302CC6FFC051302C3F +:107A0000C54F302CC88FD80AEBCD40E01897300B0B +:107A1000CAAFC3BF3246EA16AA004B5B9706301BBB +:107A20004B4A950BC3CFFE7518146A0CEDBC000EC3 +:107A3000CFB2C2BF32CBEA1BAA004ADA950B6E3B2B +:107A4000497A950BC2CF6A0CEDBC000ECFD2C1DFD4 +:107A5000328BEA1BAA004A6A950B6E2B491A950BCA +:107A6000C1EF6A0CEDBC000ECFD2C0FF330BEA1B96 +:107A7000AA0049FA950B6E4B48BA950BC10F6A0CD8 +:107A8000EDBC000ECFD2C01F499B97066E1BA1AB69 +:107A9000498A950BC04FE3CF80E0D703FFFF182C36 +:107AA000FFFF1828FFFF1830EBCD40C000A84700AB +:107AB0001302F1EC5604016B00008001016C00011F +:107AC0000000AA81010D02F1EC5603000000010044 +:107AD000FE7618146C0CEDBC000ECFB2CE8E324781 +:107AE000EA17AA0048BB9707301B48BA950BCE9EF1 +:107AF0006C0CEDBC000ECFD2CDAE486B9707300BAF +:107B0000485A950BCDEE300CC48FE3CF80C0D7031D +:107B1000FFFF1818FFFF1824EBCD4080205D189759 +:107B2000C5EFC1115807C091301CC61FE06904C4DD +:107B3000301A301B1A9CC37F0E9B1A9CC78F0E9C59 +:107B4000C4EFCFE02FBDE3CF80800000EBCD40E05D +:107B500018961697E06508F8EA1500006ADC2FFC15 +:107B60008BDC0C9CC1ECC0800C9CCEBCC0506ACCA1 +:107B70002FFC8BCCC038300C8BCC6ADC58FCC0D4CA +:107B80006ACC58BCC065301CAE8C302CE3CD80E094 +:107B9000300CAE8CE3CF90E0303CE3CD80E00000D1 +:107BA000D421E0660930EA160000780B8D0B781BB3 +:107BB000EE1B80008D1B782CEE1C80008D2C30AAD3 +:107BC0000C9B6C4CFEB0E33E6C39129A201A6C4C44 +:107BD0000043D9001302F1EC5604016C000080014F +:107BE000016D00010000C039010D02F1EC560300E7 +:107BF00000000100E06708F8EA1700006E5B143B24 +:107C0000C1A430AA2FFB5C8BFEB0E3548F9C30AA3A +:107C10006E5B2FFB5C8B6C4CFEB0E36A8FAC30AAC2 +:107C20006E5B2FFB5C8B6C4CFEB0E3808FBC6E54A4 +:107C30002FF4C3E830AAC161F7D9B010FEB0E33A1F +:107C40008F9C30AA6C3B5C8B6C4CFEB0E3518FACCC +:107C500030AA6C3B5C8B6C4CFEB0E3688FBC6C3420 +:107C6000C278F7D9B010FEB0E3198D5C30AA300BA2 +:107C70006C4CFEB0E31318958D656C546E9C680BCC +:107C8000FEB0D5326A0BFEB0D59D8F9C6EAC681BE2 +:107C9000FEB0D52A6A1BFEB0D5958FAC6EBC682BA2 +:107CA000FEB0D5226A2BFEB0D58D8FBC6C34089CFB +:107CB000FEB0D7BE189B6E9CFEB0D64E18968F664F +:107CC000089CFEB0D7B5189B6EACFEB0D645189593 +:107CD0008F85089CFEB0D7AC189B6EBCFEB0D63C1E +:107CE00018988F780A990C9A0E9B2F0B0E9C2F4C8C +:107CF000FEB0DD9A006148001302F1EC5604016DFC +:107D000000008001016E0001000055F2010D02F13A +:107D1000EC560300000001006E5C2FFC8F5C300C01 +:107D20008F6C8F8C8F7C6E3C580CC045FEB0D79208 +:107D3000C0485C3CFEB0D78EFC1641C80C9BFEB020 +:107D4000D737C0F26E4C580CC045FEB0D783C04840 +:107D50005C3CFEB0D77F0C9BFEB0D72AC022DA2A4B +:107D6000D82AD70380013370800133BC800133F8F7 +:107D700080013434800133A4800118CC80011A6062 +:107D80008001293080011D38EBCD40FC189530046E +:107D9000E06308F8EA1300006607300B0E9CE0A0D1 +:107DA0002489C131661C300BE0A02484C0E1662C1C +:107DB000300BE0A0247FC0916A0C870C6A1C871CE2 +:107DC0006A2C872CE3CF80FC6A0C0E9BFEB0D49EFD +:107DD00018976A1C661BFEB0D49918926A2C662B01 +:107DE000FEB0D4941896BFD70E9CFC173E800E9B15 +:107DF000FEB0D6DEC0E2BFD2049C0E9BFEB0D6D849 +:107E0000C082BFD60C9C0E9BFEB0D6D2C0223014CE +:107E10006A0C870C6A1C871C0009D5001302F1EC60 +:107E20005604016E00008001016F00010000EA4964 +:107E3000010D02F1EC560300000001006A2C872CB2 +:107E4000089C5C5CE3CD80FC8001B798800117F052 +:107E500080011C94D421E069136CEA190000129C83 +:107E60002A0C300A300B189E30A8BD2A2018CFE10A +:107E70009D0A129CFE3CFF4CB91B992A129CFE3CA9 +:107E8000FF00B91BF8EB0008F8EB0010996A129C90 +:107E9000FE3CFEE4B91BF8EB0008F8EB0010996A11 +:107EA0003008F3480138E06E03E8129BFE3BFEC445 +:107EB000E06C03E83006169A580CC040201C14C62B +:107EC000CFE1129CFE3CFADC300A1897580EC040F5 +:107ED000201E0ECACFE1F348090CF3480910F348FD +:107EE0000914F3480918F348091CF3480920F3481A +:107EF0000924F3480928F348092C300EF34E0930C1 +:107F0000F34E0934F34E09383015F345093CF34E6E +:107F10000940F34E09443FFCF34C0948F34C094C2B +:107F2000F34E0950F3480954F3480958F348095CE3 +:107F3000F3480960F3480964F34809680020940095 +:107F40001302F1EC5604016F000080010170000182 +:107F50000000FA21010D02F1EC56030000000100BF +:107F6000F348096C129CFE3CF690300BB91BF8EB01 +:107F70000008F8EB0010996AF348098C129CFE3C4B +:107F8000F670B91BF8EB0008F8EB0010F8EB0018DE +:107F9000B31BF2EB0008F2EB0010F2EB0018F2EB6F +:107FA0000020E06C2710F35C0014F35C0016B26E46 +:107FB000B27E930E129CFE3CFF40B91B992AFC1C1A +:107FC0004335F34C00C4FC1C4290F34C00C03FFC12 +:107FD000F35C00C8F34E09B0F35E00F0F35E00F20C +:107FE000F35E00F4F35E00F6129CFE3CF64CB91B07 +:107FF000F8EB0008F8EB0010F8EB0018F8EB0020A5 +:10800000F8EB0028F8EB003099EAF34809F0F34860 +:1080100009F8F35E00F8F34E09F4F35E00FAF35E3C +:1080200000FCF3480A00F34809FCF34E0A04129BD3 +:10803000FE3BF5B4129C1694305AB907A926201AB3 +:10804000CFD1129CFE3CF5B4F34C0A08F3480A0C5D +:10805000F3480A10E0671DE0EA1700008F188F2828 +:10806000006DC0001302F1EC5604017000008001A5 +:10807000017100010000EE9C010D02F1EC560300BD +:10808000000001008F388F48F34E0A20F34E0A1C7F +:10809000F34E0A2CF34E0A28F34E0A24F3450A380D +:1080A000F3450A34F3450A30F3480A44F3480A40DA +:1080B000F3480A3C129C2D8C300A300BB91BF8EBAC +:1080C0000008F8EB0010F8EB0018F8EB00208F5ECA +:1080D000F3480A14F3480A18129CFE3CFF34B91BFB +:1080E000992A129CFE3CFF28B91B992A129C2B0C42 +:1080F000B91BF8EB0008F3480A488F7ED82A000025 +:10810000EBCD4080203DE067136CEA1700000E9C29 +:10811000FE3CFF401A9BB908B71978289728CBFE78 +:108120001A9CFE37FF40B90AAF1B782A8F2A2FDD31 +:10813000E3CF8080D401308A300B300CFEB0F144A4 +:10814000582CC031302CD802300CE06B2584EA1B4F +:108150000000B68CB61CDA0A300CE06B2584EA1BF2 +:108160000000B68C5EFF0000EBCD40C0201D301734 +:10817000300CBA9CBA8CE0662584EA160000ED2C1F +:108180000000F80B003518001302F1EC56040171E1 +:10819000000080010172000100007B57010D02F117 +:1081A000EC560300000001001518C0F1301CAC8C27 +:1081B000300CAC2CE06C257CEA1C0000780CFEB086 +:1081C000F797E0A0110FC458581CC2A18C1C2FFCBB +:1081D000AC1CFACBFFFFE06C257CEA1C0000780C9D +:1081E000FEB0ED66C150308A300B301CFEB0F0FEA0 +:1081F000583CC0213037308A309B300CFEB0F0F64E +:10820000582C302CC280AC8CE0A012A2C2288C1C4E +:10821000E04C0096C1E5305CAC8CC8FCC1A8583C71 +:10822000C181584CC1608C2C2FFCAC2C8C2CE04CA8 +:1082300000FBCF241A9BE06C257CEA1C0000780C24 +:10824000FEB0F796C060304CAC8C301CC64CC75C9E +:108250000E9C5C6C2FFDE3CD80C0D7038001614490 +:108260008001943880014D04800197A4800161C48D +:10827000EBCD4080E067257CEA170000E0A023B248 +:108280008F1CE0A023B58F0C6E1CE06B71B0EA1B55 +:108290008001F94B0108E06B71D4EA1B8001F94BB6 +:1082A000010CE06B71E4EA1B00A8F0001302F1EC92 +:1082B0005604017200008001017300010000C4EC4B +:1082C000010D02F1EC560300000001008001F94BA2 +:1082D0000110E06B732CEA1B8001F94B0114E06B79 +:1082E0007404EA1B8001F94B0118E3CF9080D70397 +:1082F0008001BA388001BA44D401300BE06A257C91 +:10830000EA1A0000741AF53A0101580AC021D80A85 +:10831000581CC031C0AC189B169C5C6CD802000085 +:10832000D401300CC0ACDA0AE06B258AEA1B0000ED +:10833000F72C00005EFC0000E06B258AEA1B0000C1 +:10834000B68C5EFDD401308A300B300CFEB0F0608C +:10835000582CC031302CD802DA0A0000D401E06C6D +:108360002584EA1C0000300BB82BB81B308A301C67 +:10837000FEB0F04EDA0A0000EBCD40C03017E066E8 +:108380002584EA160000ED2C0000582CC1A1308A8B +:10839000309B301CFEB0F03C583CC0213037CD3F04 +:1083A000582CC041302CE3CD80C0583CC021303720 +:1083B000303CAC8CE06CD11CEA1C8001FEB07DFC32 +:1083C0000E9C5C6CE3CD80C08001544000D1C6009F +:1083D0001302F1EC560401730000800101740001E6 +:1083E0000000D0C4010D02F1EC56030000000100B2 +:1083F00080006FE8D4013019178AF40A1068F80A6F +:108400000B09178AF40A1068180AB499308A178879 +:10841000F00810681808B0AA178AF40A1068140C3B +:10842000B8C9178C2FFCB68CC8EFD80AD401C0FC91 +:10843000300CC098300BE06A261AEA1A0000F40CDF +:108440000B0B2FFC5C6C582CCF65D80A300BE06C02 +:108450002618EA1C0000B80B300AC128E06825A0E5 +:10846000EA180000F40C10061808F20C10061808A0 +:10847000B0CB2FF95C695819CF252FFA5C8A594A7D +:108480005E4D3009CF8B0000E06B25A0EA1B000099 +:10849000F80C1006F60C040C5EFC0000E06B25A046 +:1084A000EA1B0000F80C1006180B961C5EFC00007E +:1084B000EBCD4080201D3FF7189B5C5B201BC0402C +:1084C00020BBC040C0583007C0A83017C088500C2F +:1084D000E06CCF54EA1C8001FEB07D800E9C5C6C89 +:1084E0002FFDE3CD80800000EBCD40E0201D1897EC +:1084F00000653F001302F1EC560401740000800196 +:10850000017500010000BA7C010D02F1EC56030078 +:10851000000001003016CDFF18950E9C5C5C201CFD +:10852000C04020BCC040C058CB8CC0B8CA2FC09837 +:108530005007E06CCF74EA1C8001FEB07D6130060C +:108540005805C085300CE06B261AEA1B0000F605C2 +:108550000B0C0C9C5C6C2FFDE3CD80E0EBCD4080E0 +:10856000201D3FF7586CC0313007C088500CE06CBC +:10857000CF84EA1C8001FEB07D430E9C5C6C2FFD15 +:10858000E3CD808080006FE8EBCD4080E06B261863 +:10859000EA1B0000968A149C2FFC595CC035E3CF7F +:1085A00080803009C158F2081006E06E25A0EA1E4E +:1085B0000000F40C1006180E100EFACCFFF8180884 +:1085C0003067112C1CBC2027CFD12FF95C695819BA +:1085D000CEB5968C2FFCB60CE3CF9080E06C2618BD +:1085E000EA1C0000988C5EFCEBCD40803007CF7F0A +:1085F000594CC02530170E9C5C6CE3CD8080000088 +:10860000EBCD40C0232D302BBA8B301BBA9B306B87 +:10861000BAABE06B007128001302F1EC560401754F +:10862000000080010176000100002FB7010D02F16A +:10863000EC560300000001002618EA1B0000968A91 +:108640001499F20B1408BABBBAC9305B3008C2786F +:10865000E06E25A0EA1E0000F00910061C09920E2B +:108660005C7EEFDEC010A9471A965C8BEC0B0B0703 +:108670002FFB1A975C8BEE0B0B0E2FFB92195C797C +:10868000FDD9C010A94E5C8BEE0B0B0E2FFB1A9E72 +:108690005C8BFC0B0B092FFB2FF85C681438CD9515 +:1086A0005C8B1A99169A189EC0501338201A1CC851 +:1086B000CFD1169C2CEDE3CD80C00000E06C00B063 +:1086C000EA1C0000300BB82BB88BB89B301BB8AB42 +:1086D0005EFF0000D431203D300CFB6C000840DC14 +:1086E000FEB0E1D614961697FC153FE040CCFEB0E4 +:1086F000E1CFBFDB30080A99FEB0E1EAC1B20C9AC3 +:108700000E9BBFDB30080A99FEB0E1E2C13240ECBB +:10871000FEB0E1BEBFDB30080A99FEB0E1D9C0A2CD +:10872000300CE06B3F8CEA1B0000970C971C972CD9 +:10873000CE38FC13404EE06400AD06001302F1ECAD +:108740005604017600008001017700010000900CC2 +:10875000010D02F1EC56030000000100C1E6EA142D +:108760001A63E065A5DCEA15404C40CCFEB0E1A2FE +:1087700008980A99FEB0E11530080699FEB0E1119B +:108780003008E0694000EA19408FFEB0E1471490DC +:108790001691E06C3F8CEA1C0000780CFEB0E18A78 +:1087A00000980299FEB0DFE8FEB0D24E1891E06C5E +:1087B0003F8CEA1C000099010C9A0E9B08980A99BC +:1087C000FEB0E0EF30080699FEB0E0EB3008E0695B +:1087D0004000EA19408FFEB0E12114961697E06C34 +:1087E0003F8CEA1C0000781CFEB0E1640C980E99E6 +:1087F000FEB0DFC2FEB0D2281896E06C3F8CEA1CB7 +:108800000000991640ECFEB0E15508980A99FEB0B8 +:10881000E0C830080699FEB0E0C43008E0694000C6 +:10882000EA19408FFEB0E0FA14941695E06C3F8C84 +:10883000EA1C0000782CFEB0E13D08980A99FEB0D1 +:10884000DF9BFEB0D2011897E06C3F8CEA1C000061 +:108850009927029CFEB0E12E1494169500C5730072 +:108860001302F1EC56040177000080010178000149 +:10887000000007E7010D02F1EC56030000000100C3 +:10888000BFD50C9CFEB0E128149016910092029383 +:10889000BFD30E9CFEB0E12014961697BFDBBB1B26 +:1088A000089A0A9B04980699FEB0DF78BB08FEB0D0 +:1088B000DF75FEB0D1DB301BEA1B42AAFEB0D2202E +:1088C000C313BFD73018FC1940440C9A0E9BFEB05E +:1088D000E121C283BFD13018FC194034009A029BB9 +:1088E000FEB0E118C1F3FEB07AA5FEB07E7D5F1B3D +:1088F000E06C3F8CEA1C0000780C5C5BC0A0FC1BA9 +:10890000C170FEB0D209C0E2301CFB6C0008C0A8E8 +:10891000301BEA1B4170FEB0D1F3C043302CFB6C1E +:108920000008FB3C0008580CC090300CE06B3F8CFA +:10893000EA1B0000970C971C972CFB3C00082FDDCE +:10894000D832D70380013A9480013942800139BC82 +:1089500080013A548001371880011BE880013A9069 +:1089600080006DB08000756480011C9480011C7CC7 +:10897000D401E06C0524EA1C000078295C59189A9F +:1089800000ECA3001302F1EC560401780000800112 +:10899000017900010000475C010D02F1EC56030073 +:1089A000000001002EAA198B306CFEB07BC3D802E8 +:1089B000D401E06C0524EA1C000078295C59189A5F +:1089C0002E8A198B306CFEB07BB5D802EBCD40C03F +:1089D000E0680540EA180000119E3007C0282FF714 +:1089E000F6071800C1825C57F8070709125E5C5E43 +:1089F0003089C0580C9E5C5EFE39FF015C595819E5 +:108A0000CEF5FC061501EDBE0007CF52118E0C5EAF +:108A10005C5ECF3B143E5F0CE3CD80C0D401CBBF86 +:108A2000D8020000EBCD40E0202D18973055E066CD +:108A30000524EA160000300830691A9A0D8B306C54 +:108A4000FEB07BD2581CCF410A9CFE3500015C7CF5 +:108A5000CEF01BAA302B1A9CCBAFC0701BDA302B88 +:108A6000FACCFFFDCB4FC031300CC3D88C2C2FFC7F +:108A7000AC2C1B9B1B8CF7EC108BE06C1117B93BDB +:108A8000AF4BE02B11945C8B6C3C160C8D3C1BCBDC +:108A90001BBCF7EC108BE06C09C4B93BAF4B5C8B93 +:108AA0006C4C160C001686001302F1EC560401798A +:108AB00000008001017A00010000D297010D02F14F +:108AC000EC560300000001008D4CE06C3828EA1CD5 +:108AD0000000786C2F1C198C580CCD908C2C6C3BA2 +:108AE000F60C0C0A6C4BF60C0C08300C8D3C8D4CC3 +:108AF000AC2CF9DAB010A94CAE8CAE9AF9D8B01003 +:108B0000A94CAEACAEB8301C2FEDE3CD80E0000038 +:108B1000EBCD4080201DE0670524EA1700006E2998 +:108B20005C590E9A2E6A0F8B306CFEB07B153008A4 +:108B300030391A9A0F8B306CFEB07B68581CC1011B +:108B40001BAA302B1A9CC55FC031300CC0981B9BF0 +:108B50000FAC186B0F9CF80B1800CF81301C2FFD49 +:108B6000E3CD8080D401E06C0524EA1C0000300BCA +:108B7000993B994BB82BC2FFD80200005EFF000062 +:108B8000EBCD40C0201D1897300CAE8CE06605245C +:108B9000EA1600006C295C590C9A2E6A0D8B306C19 +:108BA000FEB07ADA300830391A9A0D8B306CFEB08C +:108BB0007B2D581CC0A11BAA302B1A9CC1AFC03101 +:108BC000300CC038301CAE8C00C801001302F1EC30 +:108BD0005604017A00008001017B000100006D2C29 +:108BE000010D02F1EC560300000001002FFDE3CD62 +:108BF00080C0D7038000708C80007140EBCD40FEB8 +:108C000018973002E0661E40EA1600000D8C581CD2 +:108C1000C051049C5C5CE3CD80FE0D9C580CC5915A +:108C20006C1C580CC101E0651E34EA1500006E0C86 +:108C30008B0C6E1C8B1C6E2C8B2C2FC66C0C2FFC83 +:108C40008D0CCE8BE0651E34EA1500006E0C6A0BAD +:108C5000FEB0CE46FEB0DF76BFDBFEB0D03D18934F +:108C60006E1C6A1BFEB0CE3CFEB0DF6CBFDBFEB0FC +:108C7000D03318946E2C6A2BFEB0CE32FEB0DF6279 +:108C8000BFDBFEB0D0291897E0616666EA113FA607 +:108C9000069C029BFEB0D076C192089C029BFEB05F +:108CA000D071C1420E9C029BFEB0D06CC0F26C1C15 +:108CB0002FFC8D1C6C1C595CCAD5300C8B0C8B1C8A +:108CC0008B2C8D1C301CAC9CCA5B300C8D1CCA2BB1 +:108CD0006C2C580CC3F16C1C580CCA60E0651E3437 +:108CE000EA1500006E0C6A0BFEB0CDFA00584F007A +:108CF0001302F1EC5604017B00008001017C0001AD +:108D000000007904010D02F1EC560300000001009F +:108D1000FEB0DF2ABFDBFEB0CFF118936E1C6A1BDA +:108D2000FEB0CDF0FEB0DF20BFDBFEB0CFE7189481 +:108D30006E2C6A2BFEB0CDE6FEB0DF16BFDBFEB0B8 +:108D4000CFDD1897E0656667EA153FA6069C0A9B8B +:108D5000FEB0D01EC0C2089C0A9BFEB0D019C072E3 +:108D60000E9C0A9BFEB0D014FE93FF67301C8D2C26 +:108D7000300C8D1CC61B581CFE91FF5F6C1CE04C18 +:108D80000096C0642FC66C0C2FFC8D0CC55BFE904A +:108D9000FF5E6C3CE04C0032C3E4E0651E34EA1533 +:108DA00000006E0C6A0BFEB0CDADFEB0DEDDBFDBA9 +:108DB000FEB0CFA418936E1C6A1BFEB0CDA3FEB00C +:108DC000DED3BFDBFEB0CF9A18946E2C6A2BFEB0B8 +:108DD000CD99FEB0DEC9BFDBFEB0CF9018976C3CDA +:108DE0002FFC8D3CE0656667EA153FA6069C0A9B52 +:108DF000FEB0CFCEC0C2089C0A9BFEB0CFC9C072E5 +:108E00000E9C0A9BFEB0CFC4FE93FF17301CAC8CA7 +:108E10000041DC001302F1EC5604017C00008001EB +:108E2000017D0001000013BC010D02F1EC560300AE +:108E3000000001003012C12B300C8D1C8D2C8D3C9C +:108E4000AC9CC0CB80011C94800117F080013A5487 +:108E500080011BE880011C7CEBCD4080201D338C01 +:108E6000BA8CE0671E20EA17000030191A9A320BFC +:108E7000307CFEB079A78F0C370CBA8C30191A9A57 +:108E8000322B307CFEB0799E8F0C300CBA8C3019AE +:108E90001A9A324B307CFEB079958F0CE06C0080D2 +:108EA000BA8C30191A9A320B307CFEB0798B8F0C49 +:108EB0002FFDE3CD80800000EBCD4080201D338C62 +:108EC000BA8CE0671E24EA17000030191A9A320B98 +:108ED000307CFEB079778F0C370CBA8C30191A9A27 +:108EE000322B307CFEB0796E8F0C300CBA8C30197E +:108EF0001A9A324B307CFEB079658F0C2FFDE3CD92 +:108F000080800000D401201DE06C0080BA8C3019F4 +:108F10001A9A320B307CFEB079552FFDD802000032 +:108F2000D401201DE06C0080BA8C30191A9A320BE3 +:108F3000307CFEB00028F3001302F1EC5604017DF2 +:108F400000008001017E000100008677010D02F122 +:108F5000EC5603000000010079472FFDD802000005 +:108F6000EBCD40FE203D18973001300CBA8C300616 +:108F7000301230133005C3A80A9C2D0CBA8C30195E +:108F80001A9A320B307CFEB0792F1891EE0600044D +:108F900030083019089A2FFA323B307CFEB0797EC7 +:108FA00030083019089A321B307CFEB079772FE6F2 +:108FB0005C56EA0C1501EE0C000B178AA96A179B88 +:108FC000140BFACAFFFC180AB40BE06A1E14EA1A62 +:108FD0000000140C982CF80B1900C02030025C8B98 +:108FE000581BC02530032FF55C555835CC6530062D +:108FF000AEE6AEF65C525812C0405C535813C21134 +:10900000E0671E14EA170000EF2C0000586CC055F2 +:10901000029C2FDDE3CD80FE8E9C2FFCAE1C8E9C2F +:1090200058ACCF75E06CD0B4EA1C8001FEB0788AF1 +:10903000C7CFC55FEF2C00002FFCAE8CAE16CE9BC9 +:10904000E0671E14EA170000FACAFFFC0E9C2FCC42 +:109050001898306B153910C900B625001302F1ECD1 +:109060005604017E00008001017F0001000039CC20 +:10907000010D02F1EC56030000000100201BCFD1CE +:10908000AE16AE86CD8BD7038000708C8000714009 +:1090900080006FE8E1BC0000D3035EFCB18CF9DC1A +:1090A000C001EC1C00015EFCD401CF9FC020D503A1 +:1090B000D80A0000D401201CC060201CC070201CF5 +:1090C000C080D80AE0A010F4D80AE0A0110FD80A96 +:1090D000E0A0112AD80AD7038001A1308001A16C39 +:1090E0008001A1A8201CC080201CC0C0201CC0F092 +:1090F000201C5E0F5EFDFE7C1814780CF9DCC001AC +:109100005EFC486C780CF9DCC0015EFC484C780CC5 +:10911000F9DCC0015EFCD703FFFF1864FFFF1850A5 +:10912000EBCD40801897F9D7C008CDDFCFD0E3CF83 +:1091300080800000E06C054CEA1C0000F92B000068 +:109140005C5BC060202BC070201BC0A05EFDE07C7B +:10915000C1385EFCE06C5A00EA1C02625EFCE06C06 +:109160000E00EA1C07275EFCD401CE5FA38CD80258 +:10917000EBCD40C018961697C8EFFE7A00401E004F +:109180001302F1EC5604017F000080010180000110 +:10919000000084A7010D02F1EC560300000001005D +:1091A0001420F406002A7409320BEA1BAA00F60602 +:1091B000002BFE781458910B301BF607094B16490B +:1091C0009509C85FE3CF80C0EBCD40E030073006A3 +:1091D0003005580CC040201CA7BC1897580BC04045 +:1091E000201BA7BB1696580AC040201AA7BA149590 +:1091F000C64F304BEA1BAA00496A950BFE7B14044C +:10920000970730CBEA1BAA00950B486B9706310BEA +:10921000EA1BAA00950B484B9705C59FE3CF80E05A +:10922000FFFF140CFFFF1410EBCD40801897C45FB4 +:10923000FC1BAA00487A950BFE7B14009707C47F9D +:10924000E06C054CEA1C0000B887E3CF8080D703B0 +:10925000FFFF1458D401302A302B302CCB6FE06C38 +:10926000054CEA1C0000F92B00005C5B202BC04081 +:10927000201BC0B0C138300CFEB0F5B8C88FFEB0AE +:10928000E3CF302CCD2FC0A8303CC27F303CC5BFCF +:10929000C7EFFEB0E3C5303CCC8FC0FFC18FD80A0A +:1092A00000531D001302F1EC560401800000800100 +:1092B000018100010000C834010D02F1EC560300E9 +:1092C0000000010080016C488001487CEBCD40C06B +:1092D000201DD553300CBA8CE0A01C7AE0800081B0 +:1092E000E0672594EA170000FEB076468F1CE0A0E8 +:1092F0001A9FFEB0A4456E1CE066259CEA1600008D +:10930000780B580BC0400D8BA1ABAC8B301BFEB063 +:1093100077376E1CFEB076A46E1C783B580BC040AD +:109320000D8BA1BBAC8B785B580BC0400D8BA3ABF6 +:10933000AC8B786B580BC0400D8BA3BBAC8B0D8BEB +:1093400058FBC051355B2B0CB88BC0382B0CB88B3D +:10935000300A301B301CFEB07A5BFEB079D7E0A03B +:109360001A21332B6E1CFEB0790B6E1CFEB07834C4 +:109370006E1CFEB07857FEB0796FFEB07985FE7C2A +:109380001580780C6E1CF93B0050E04B0055C21163 +:10939000301BFEB079EF301CBA8C300B6E1CFEB067 +:1093A00079C9E0A01C33324BF96B008231CBF96BE9 +:1093B0000083300BF95B006E1B8B580BC120303BD8 +:1093C000F96B007E00BCA2001302F1EC560401818F +:1093D000000080010182000100005DFF010D02F12B +:1093E000EC56030000000100F96B007F304BF96B75 +:1093F0000080C098300CFEB0799D307CE0A017282A +:10940000CFDB300C2FFDE3CD80C0D7038001BA083D +:1094100080006DB08001B6688000C9B880006FB868 +:1094200080006E9880007648800075448001B5DC2D +:10943000800073B8800072108000725C80007490AD +:10944000800074C0800075AC8000756C8001BA44E7 +:10945000EBCD40C0E0672594EA170000C4AF8F0C45 +:10946000C078301AFEB07CB4307CE0A016F16E1BE0 +:109470006E0CF91A006E581ACF54300AFEB07CA850 +:109480006E1CFEB07B47FEB05065C0D13006C028D0 +:109490002FF65C565836C0746E1CFEB07B3BFEB097 +:1094A0005059CF70300B6E1CFEB0796A6E0C292CAF +:1094B000988C580CCDD1300CFEB0793C307CE0A0BB +:1094C00016C7CD6B80007BE480007928800023687C +:1094D00080007594800075488001B064EBCD40E059 +:1094E000216DE0671FE8EA17006411001302F1EC38 +:1094F0005604018200008001018300010000E24463 +:10950000010D02F1EC560300000001000000E0A094 +:109510001BA18F0C300CFB5C0054FB6C002D30AB9E +:10952000FB6B002EFB6C0030FB6C0031FB360069DE +:109530000C9B20ABC060E088004A203BC133C4686C +:10954000318CFB6C002D300CFB6C002CFACCFFD462 +:109550001A9B32C9190A16AA2049CFD1FEB0E938A0 +:10956000C358E0651FECEA1500000BBC580CC24163 +:109570000BCC580CC211E06C00AABACC33CCBADCCC +:10958000301CBAEC300CFB6C002C303CFB6C002D1A +:10959000FACCFFD01A9B3249170A18AA2049CFD11A +:1095A000FACCFFD41A9B32C9190A16AA2049CFD186 +:1095B000FEB0E90EC028301C0C9B58BBC031301ADD +:1095C000AABA58CBC031301BAACB5C6C581CC0C1A6 +:1095D0006E0AF519005E301BFE36FF0AF606094BCF +:1095E00016492A2AB4092EADE3CD80E0EBCD40E048 +:1095F000216DE0671FE8EA170000E0A01B2B8F0C2D +:109600003006FB560054FB66002D30AC0049740058 +:109610001302F1EC56040183000080010184000173 +:109620000000F66C010D02F1EC5603000000010091 +:10963000FB6C002EFB660030FB660031300CFB3506 +:1096400000690A9B20ABC060201BC1A0201BC20088 +:10965000C268318CFB6C002D301CFB6C002CFACCEA +:10966000FFD41A9B32C9190A16AA2049CFD1FEB0DD +:10967000E8C1E06B1FECEA1B0000B686C108E06B96 +:109680001FECEA1B0000B6B6301CB696C088E06B33 +:109690001FECEA1B0000B6C6301CB6A6E06B1FEC40 +:1096A000EA1B000017BA580AC14117CB580BC11169 +:1096B000303CFB6C002D301CFB6C002CFACCFFD432 +:1096C0001A9B32C9190A16AA2049CFD1FEB0E892D6 +:1096D0006E0BF71A005E3019FE35FF0AF2050949D4 +:1096E000128A2A2BB60A5C6C2EADE3CD80E0D7033C +:1096F0008001BA44800155C0D431202D14941695B0 +:109700001893E068CD57EA185E9EE0692614EA19BE +:109710003FD1FEB0DAD7C223E0664CAAEA16E85879 +:10972000E067B67AEA173FFB089A0A9B0C980E99F5 +:10973000008425001302F1EC56040184000080012E +:109740000185000100009CD4010D02F1EC560300DC +:1097500000000100FEB0D90CBB2B089A0A9B0C98A4 +:109760000E99FEB0DA1A30083009EA19BFF0FEB0DF +:10977000D8FFBB09FEB0DA4E14941695A1A33008A9 +:109780003009EA19BE40089A0A9BFEB0DAAFC0A3BE +:1097900030183009EA193E40089A0A9BFEB0DAA454 +:1097A000C7B3089A0A9B08980A99FEB0D9F614968E +:1097B0001697E06839DEEA188F02E069C0C7EA1937 +:1097C0003F74FEB0D9EAE068AB8AEA188312E06918 +:1097D0000C00EA193FC8FEB0D8CB0C980E99FEB029 +:1097E000D9DCE068D724EA1808E5E069D8B6EA19B8 +:1097F0003FF0FEB0D8BD0C980E99FEB0D9CEE0680F +:10980000340FEA180E58E0699558EA193FFDFEB08A +:10981000D8AF0C980E99FEB0D9C030083009EA19BB +:109820003FF0FEB0D8A5BB1BE0685D84EA18135773 +:10983000E069574BEA193FB00C9A0E9BFEB0D9ADC8 +:10984000E06893B2EA18194CE0695EEDEA193FE46A +:10985000FEB0D88E00B0B4001302F1EC56040185BE +:1098600000008001018600010000091F010D02F1C6 +:10987000EC560300000001000C980E99FEB0D99F31 +:10988000E068DEBEEA18B902E0694002EA193FF872 +:10989000FEB0D880BB2B089A0A9B0C980E99FEB09C +:1098A000D98EBB09FEB0D98B08980A99FEB0D87240 +:1098B000BB08FEB0D9C114941695EDB30001C032B7 +:1098C000EE158000F9D3C003C0D0E06BCB24EA1BB7 +:1098D0008001F60C023A08980A99FEB0D85B1494FD +:1098E0001695A583E80A1720EA0B1720C052EE153B +:1098F0008000089A0A9B2FEDD832D70380013A9452 +:1099000080013A9080013942800139BC80013718CA +:10991000D401201D1A9CE06BD143EA1B8001303931 +:10992000173A18CA2019CFD130391A9A320B307C25 +:10993000FEB074EAC031300CC068E06C008CEA1CE8 +:109940000000780C2FFDD802D401201D1A9C300B8A +:10995000B88BB89BB8AB30391A9A320B307CFEB05A +:1099600074D3C031300CC068E06C0090EA1C000079 +:10997000780C2FFDD8020000008B99001302F1EC47 +:109980005604018600008001018700010000B6A492 +:10999000010D02F1EC56030000000100D401201D6E +:1099A0001A9CE06BD128EA1B80013039173A18CA9B +:1099B0002019CFD130391A9A320B307CFEB074B6F0 +:1099C000C031300CC068E06C0094EA1C0000780CD8 +:1099D0002FFDD802D401201D1A9CE06BD146EA1B52 +:1099E00080013039173A18CA2019CFD130391A9A64 +:1099F000320B307CFEB0749AC031300CC068E06C21 +:109A00000098EA1C0000780C2FFDD8028000708CB2 +:109A1000EBCD40FE202D189230113013301430075A +:109A2000C1C80D8C0D9BAC8BAC9C0D8BA96B0D9C98 +:109A3000160C1A9B0A0BB60CE06B1E28EA1B0000E2 +:109A400016058A2BF60C1900C02030035C8C581CBC +:109A5000C02530042FF75C575847C1A4EE05150107 +:109A6000E405000630280C990E9A2F8A5C5A320BB6 +:109A7000307CFEB074871891CD51E06CCEF4EA1CB6 +:109A80008001FEB07401300C2FEDE3CD80FE5C53FD +:109A90005813C0405C545814C211E06700B0EF0086 +:109AA0001302F1EC560401870000800101880001D7 +:109AB0000000214F010D02F1EC56030000000100EF +:109AC0001E28EA170000EF2C0000586CC035029CDD +:109AD000CEEB8E9C2FFCAE1C8E9C58ACCF95E06CD0 +:109AE000CEF4EA1C80012F8CFEB073E0C6AFC51F18 +:109AF000EF2C00002FFCAE8C300CAE1CCE9BE06730 +:109B00001E28EA1700001A9A0E9C2FCC1898308B4A +:109B1000153910C9201BCFD1300CAE1CAE8CCD8BAB +:109B2000800070E480006FE8D401CC9CE0A011A616 +:109B3000E0A016E6E0A018FCE0693C84EA19000009 +:109B4000129CFE3CFE7C300A300B189E3088BD2AE9 +:109B50002018CFE19D0A129C2F4CB91BB84AB31BA9 +:109B6000B24A129CFE3CFE38B91B992A129C2E8CDC +:109B7000189E32D8BD2A2018CFE19D0A31EC2E89DB +:109B8000B20CD80A8001B63C8001BA6CD401E0A0C6 +:109B90001175D80A8001ABB8D401E0A018CBE0A0C1 +:109BA000186BD80A8001BA708001B9B4D401E06C96 +:109BB0003C84EA1C0000E0A006E3D80A800196BCC1 +:109BC00000F99B001302F1EC5604018800008001AB +:109BD00001890001000061F4010D02F1EC5603005F +:109BE00000000100E06C3C84EA1C0000189B2F4B35 +:109BF000189AB509B728150816A8300BB81B5EFDD2 +:109C0000EBCD40801897FEB0D4498E8C2FFCAE0C63 +:109C10008E8C8E1B163CC0358E1CAE0CE3CF908014 +:109C2000800131B4EBCD40C0E06C3E5CEA1C00002A +:109C30007807E0663C84EA1600000C9BFE3BFE3889 +:109C40000C9C2F4CCDEF31EA0C9BFE3BFE380C9C5C +:109C50002E8CFEB0D501301B0C9CFE3CFE38FEB0B5 +:109C6000CF0DEDB70001C082300B0C9CFE3CFE38DE +:109C7000FEB0CC72C078301B0C9CFE3CFE38FEB0AF +:109C8000CC6B300BFE36FE7C0C9CC1BCE3CF80C09D +:109C9000800133708001279480012270E06C3C8445 +:109CA000EA1C0000FE3CFE7C5EFC0000E06B3C8495 +:109CB000EA1B0000F6FA0184188AF74A01845EFD67 +:109CC000780A144B990B5EFDE06C3C84EA1C0000A2 +:109CD0002E8C5EFCE06B3E58EA1B0000970C5EFD8C +:109CE000E06C3E5800C190001302F1EC560401896B +:109CF00000008001018A00010000F43F010D02F123 +:109D0000EC56030000000100EA1C0000300B780A4A +:109D1000950B780A951B780A952BE06B0400780A5E +:109D2000953B780A954B780A955B301B780C2E8C06 +:109D3000B88B5EFDEBCD40C018973006E0A00A6AF4 +:109D4000581CC081301CE06B1FECEA1B0000B68C75 +:109D50003016FEB0901F581CC1315C67C111E06C19 +:109D60001FECEA1C000019BB581BC041301BB89BFC +:109D7000301619CB581BC041301BB8AB30160C9CA9 +:109D80005C6CE3CD80C0D70380019F08D401300C08 +:109D9000E06B1FECEA1B0000B68CE0A00A3FD80A7B +:109DA00080019F10D401300CE06B1FECEA1B000017 +:109DB000B69CFEB09003D80AD401300CE06B1FECC7 +:109DC000EA1B0000B6ACFEB08FF9FEB08FEFD80AE8 +:109DD0008000AAB08000AAA0EBCD40F824ED189630 +:109DE00016973005E0641FECEA140000E92C00002F +:109DF000581CC0A1304CBA8C30ACBAACE0A00A18E8 +:109E0000BACC3015CC4FE92C00FA7C001302F1ECEF +:109E10005604018A00008001018B000100004B8480 +:109E2000010D02F1EC560300000001000001581C76 +:109E3000C0F11A9CEA0310681803304CA68C30BCA1 +:109E4000A6ACFEB08FB9A6CC2FF55C55CBEF2FE4B6 +:109E5000E92C0000581CC0F11A9CEA041068180490 +:109E6000304CA88C30CCA8ACFEB08FAC891C2FF540 +:109E70005C55CB5F0F8C0A0C587CC1D50F8C0A0C3B +:109E800020AC5C6CF3DCB008C108F20810680C0868 +:109E9000F20C010BF60E10680C0E3684BD0BB12AC5 +:109EA0002084CFD12FF95C690F8B1639CEF50F8B3B +:109EB000162CAE8C3009C1280F8CF80810680C08DD +:109EC0001A9EF20C1068180E368CBD0BB12A208C2D +:109ED000CFD10F8C2FFCAE8C2FF95C690A39CED50F +:109EE0002B2DE3CF80F8D70380019F248000AA8820 +:109EF0008000AA94EBCD4080E067CDA0EA178001F6 +:109F00000E9CFEB0720930FA301B300CFEB0E4300B +:109F1000582CC0812F070E9CFEB071FE302CE3CD73 +:109F20008080E3CF90800000EBCD40800062A200F3 +:109F30001302F1EC5604018B00008001018C00013A +:109F400000005FAC010D02F1EC56030000000100BF +:109F5000E067CDD8EA1780010E9CFEB071EF30FAB1 +:109F6000301B301CFEB0E416583CC0812F070E9CFD +:109F7000FEB071E4303CE3CD8080E3CF9080D70326 +:109F800080015440D401201D300CBA8C1A9CFEB0C4 +:109F90006CA7301CC5ACFB2C0000C49C2FFDDA0A5A +:109FA0008000658CD401E06CCF34EA1C8001FEB0E7 +:109FB00071C5E0A016EBE06B24A4EA1B0000970C2F +:109FC000E06B8BC8EA1B8001F94B01E8E06B8BFC6E +:109FD000EA1B8001F94B01ECE06B8C34EA1B800139 +:109FE000F94B01F0E06B8CB8EA1B8001F94B01F4EE +:109FF000E06B8D04EA1B8001F94B01F8DA0AD70304 +:10A0000080006FE88001BA38D401E06C24A4EA1C17 +:10A010000000780CF93C01E1580CC021D80AC0DCE2 +:10A02000D8020000D401300CC10CDA0AE06B24A97C +:10A03000EA1B0000B68C5EFDE06B24A8EA1B000062 +:10A04000F72C00005EFC0000E06B24A8EA1B000077 +:10A0500000B231001302F1EC5604018C00008001C3 +:10A06000018D000100003514010D02F1EC560300D2 +:10A0700000000100B68C5EFDD401189A301C1789CF +:10A08000F2091068F4090B0C1789F2091068140919 +:10A09000B29C30FC1789F20910681409B2ACE06C6C +:10A0A00024A9EA1C0000F9290000178CF80C10689C +:10A0B000180AB4C9178C2FFCB68CCC7FD80A0000C4 +:10A0C000EBCD40C01697E06B3828EA1B0000F60C79 +:10A0D0000326AC8CE06BC670EA1B80018DCB58ACBC +:10A0E000F9BC020A1E0C19EC180F0E22303E506407 +:10A0F0009C7688AEC000303CED6C001030ACED6C4E +:10A10000000CFE3BFF3C8DCBC508303CED6C0010D5 +:10A1100030ACED6C000CC498303CED6C0010305C41 +:10A12000ED6C000CC428303CED6C0010305CED6C24 +:10A13000000C2C8B8DCBC398304CED6C001030ACE8 +:10A14000ED6C000CFE3BFF588DCBC2F8301CED6C63 +:10A150000010305CED6C000C290B8DCBC268304CCC +:10A16000ED6C0010305CED6C000C2ACB8DCBC1D8AF +:10A17000301CED6C00D805001302F1EC5604018D83 +:10A1800000008001018E00010000A0DF010D02F13E +:10A19000EC560300000001000010305CED6C000C78 +:10A1A000FE3BFF748DCBC138303CED6C0010305C51 +:10A1B000ED6C000C2E4B8DCBC0A8303CED6C00102C +:10A1C00030ACED6C000CFE3BFF208DCBED3C000C69 +:10A1D000ED3B0010B73CA17CE0A00A348D2CED3C97 +:10A1E000000C201CACDCED3C000C201CACCC300C7A +:10A1F000ED6C000E301BED6B000FED6C000DAC9C98 +:10A20000ED5C00243FFBED6B00263FFAED5A002881 +:10A21000300AC148EC09001814082EB8B08C2FF988 +:10A220005C695869CF85EC0A0009F36C0021F36B77 +:10A2300000112ED9B28B2FFA5C6A582AC03430092B +:10A24000CF0B8DB7E3CF80C08001A2A8EBCD40E05B +:10A25000218DFACCFFF4FEB0E33BFACCFFC8E0A0BE +:10A260001479E0672568EA170000FB1C0046AECCB5 +:10A27000FACCFFF4780A500A781A501A782A502A31 +:10A280000E9CFEB0C82F1896E0652579EA150000EF +:10A290000B8C1836C100582600C59A001302F1EC49 +:10A2A0005604018E00008001018F000100001F6430 +:10A2B000010D02F1EC56030000000100C071301CDA +:10A2C000C62C301C2F87AE8CC0885816C061301C3D +:10A2D000C5AC302C2F87AE8CAA862E8DE3CF90E0B4 +:10A2E000800155348001B7B880011F48D401E0A037 +:10A2F0001583E06B2568EA1B0000973C300A2F8B22 +:10A30000B68AE06B9918EA1B8001F94B01A8E06B53 +:10A3100099F4EA1B8001F94B01ACE06B8EB4EA1BA7 +:10A320008001F94B01B0E06B8F88EA1B8001F94B8B +:10A3300001B4E06B8FD4EA1B8001F94B01B8DA0A53 +:10A340008001BA38D401E06C2568EA1C0000783C32 +:10A35000F93C01A1580CC021D80AC0DCD802000089 +:10A36000D401300CE06B2568EA1B00002F8BB68C03 +:10A37000C0ACDA0AE06B2578EA1B0000F72C00007D +:10A380005EFC0000E06B2578EA1B0000B68C5EFDE9 +:10A39000D401189A301C1789F2091068F4090B0CC3 +:10A3A0001789F20910681409B29C30DC1789F20988 +:10A3B00010681409B2ACE06C2568EA1C008EA60097 +:10A3C0001302F1EC5604018F00008001019000019E +:10A3D00000000F0C010D02F1EC560300000001001B +:10A3E00000002F8CF9290000178CF80C1068180A4F +:10A3F000B4C9178C2FFCB68CCC6FD80AEBCD40C0FB +:10A4000020EDFACCFFF4FEB0E287FACCFFE8780A40 +:10A41000500A781A501A782A502AFEB0F331189749 +:10A42000E0662544EA1600000D8C0E3CC1705817FA +:10A43000C0A1301CC6EC301CE06B2538EA1B0000C4 +:10A44000B68CC0B85827C091301CC63C302CE06B8D +:10A450002538EA1B0000B68CAC872F2DE3CF90C0C7 +:10A46000800155348001769CEBCD4080E067253833 +:10A47000EA170000E0A014D28F2CE0A014D58F1CA6 +:10A48000300CAE8C6E2CE06BB424EA1B8001F94BCF +:10A490000208E06BB444EA1B8001F94B020CE06B4C +:10A4A000901CEA1B8001F94B0210E06B90F0EA1B54 +:10A4B0008001F94B0214E06B913CEA1B8001F94BDF +:10A4C0000218E3CF9080D7038001BA388001BA44E4 +:10A4D000D401E06C2538EA1C0000782CF93C02011C +:10A4E00000B032001302F1EC56040190000080012C +:10A4F0000191000100001BB1010D02F1EC560300B7 +:10A5000000000100580CC021D80AC0DCD8020000AD +:10A51000D401300CE06B2538EA1B0000B68CC0BCBF +:10A52000DA0A0000E06B2545EA1B0000F72C00006A +:10A530005EFC0000E06B2545EA1B0000B68C5EFD6A +:10A54000D401189A301C1789F2091068F4090B0C11 +:10A550001789F20910681409B29C310C1789F209A5 +:10A5600010681409B2ACE06C2538EA1C0000F92927 +:10A570000000178CF80C1068180AB4C9178C2FFC4F +:10A58000B68CCC7FD80A0000EBCD40EC1896300595 +:10A59000E0674090EA1700000F8CF80B1518C451C3 +:10A5A000FC133FF86C0CFEB0D459BFDB30080699A1 +:10A5B000FEB0D474C1A26C1CFEB0D450BFDB300816 +:10A5C0000699FEB0D46BC1126C2CFEB0D447BFDB31 +:10A5D0003018FC194021FEB0D45FC0736E1C2FFCF4 +:10A5E0008F1C300C8F2CC0686E2C2FFC8F2C300CE5 +:10A5F0008F1C6E1C585CC1056C2C301BFEB0C54214 +:10A60000C053301500079D001302F1EC5604019170 +:10A61000000080010192000100008E7A010D02F11C +:10A62000EC56030000000100301CAE8CC048302501 +:10A63000302CAE8C300C8F1CC5F86E2C585CC5C508 +:10A640003035303CAE8C300C8F2CC568583CC291F4 +:10A65000FC133FF86C0CFEB0D413BFDB3008069936 +:10A66000FEB0D42EC1826C1CFEB0D40ABFDB300811 +:10A670000699FEB0D425C0F26C2CFEB0D401BFDB2D +:10A680003018FC194021FEB0D419C0536E1C2FFCA9 +:10A690008F1CC038300C8F1C6E1C585CC2D5CBFB95 +:10A6A000581CC030582CC281FC133FF86C0CFEB013 +:10A6B000D3E7BFDB30180699FEB0D400C1426C1C52 +:10A6C000FEB0D3DEBFDB30180699FEB0D3F7C0B2C0 +:10A6D0006C2CFEB0D3D5BFDB3008FC194021FEB096 +:10A6E000D3EFC0526E2C2FFC8F2CC038300C8F2C27 +:10A6F0006E2C582CCA640A9C5C5CE3CD80ECD703BA +:10A7000080011C7C80013A9080013A5480013A9487 +:10A71000EBCD4080201D300CBA8CE0672104EA1795 +:10A7200000001A9B6E1CFEB000458D001302F1EC78 +:10A73000560401920000800101930001000031C124 +:10A74000010D02F1EC56030000000100B6DFC090DD +:10A75000301CC67CFB2B0000AE8BEF2C0000AE9CA7 +:10A760002FFDE3CF9080D703800100BCEBCD40806C +:10A77000E0672104EA170000E0A013868F2CE0A018 +:10A7800013898F1C300CAE8C6E2CE06BB460EA1B0E +:10A790008001F94B00E8E06BB480EA1B8001F94BC3 +:10A7A00000ECE06B92E8EA1B8001F94B00F0E06BF3 +:10A7B0009388EA1B8001F94B00F4E06B93E0EA1BFD +:10A7C0008001F94B00F8E3CF9080D7038001BA38BD +:10A7D0008001BA44D401300BE06A2104EA1A000077 +:10A7E000742AF53A00E1580AC021D80A5C6CC031DD +:10A7F000C10C189B169C5C6CD8020000D401300C74 +:10A80000E06B2104EA1B0000B68CC0BCDA0A000031 +:10A81000E06B2110EA1B0000F72C00005EFC00003A +:10A82000E06B2110EA1B0000B68C5EFDD401189A83 +:10A83000301C1789F2091068F4090B0C1789F2090A +:10A8400010681409B29C307C1789F209009937000E +:10A850001302F1EC56040193000080010194000101 +:10A86000000025E9010D02F1EC5603000000010093 +:10A8700010681409B2ACE06C2104EA1C0000F9294C +:10A880000000178CF80C1068180AB4C9178C2FFC3C +:10A89000B68CCC7FE06CD094EA1C8001FEB06DDEFB +:10A8A000D80AD70380006FE8D421E0670104EA17D3 +:10A8B0000000EF3C03B2581CC021D82AE0653F9845 +:10A8C000EA1500000A9C2B0CFEB0FACC0A9C2B0C5B +:10A8D000E0A012C83006EB66008CEB66008DFEB07F +:10A8E000FAC7EB4700E4EB4600EC0A9C288C300AE0 +:10A8F000300BB91BF8EB0008994A0A9930ACB32A1F +:10A90000201CCFE10A9CFE3CFF6C189830A9B12AAC +:10A910002019CFE1EB4600F0300CC088F80B103561 +:10A92000A36B0E0BB6C6B6E62FFC583CCF85301491 +:10A93000EB440090301CC19CEF64038D301CFEB0D2 +:10A94000F9CDEF4603B4EF6603B0FEB0F9F9EF645A +:10A9500003B2DA2A800189F08001B9F0800189FC14 +:10A9600080018868800188CCEBCD4080189A30083F +:10A97000006F7B001302F1EC56040194000080018B +:10A980000195000100004F51010D02F1EC5603004A +:10A9900000000100C1A8F808002CF8FC0358F80ECC +:10A9A0001035A36E160E301CBCCCF2F700F4F00C80 +:10A9B0001035A36C180B17ECFCCBFFE0F60C0F8CDA +:10A9C0001847F34700F42FF8E06B0104EA1B00007E +:10A9D000F40C1505160CE0693F98EA190000F93EE1 +:10A9E00003541C38CD95F93A0354F76A03B1F93C86 +:10A9F000036CF36C0068581AC044169CE3CD808049 +:10AA0000F36A000DF34B00E4169CE3CD8080000058 +:10AA1000E1BC0000D3035EFCB18CF9DCC001EC1C8E +:10AA200000015EFCD401CF9FC020D503D80A0000EE +:10AA3000EBCD40C03009C09878AE30171188EE08D1 +:10AA400009470E8E99AE2FF91439C522F208100667 +:10AA50001608119E581EC0817857301E1186FC06BC +:10AA6000094E0E4EC078785E30171186EE06094703 +:10AA70000E8E995E11AE581EC0817867301E118609 +:10AA8000FC06094E0E4EC078786E30171186EE0621 +:10AA900009470E8E00D363001302F1EC56040195B2 +:10AAA00000008001019600010000DA9A010D02F118 +:10AAB000EC56030000000100996E11BE581EC081C3 +:10AAC0007877301E1186FC06094E0E4EC078787ECF +:10AAD00030171186EE0609470E8E997E11CE581E4C +:10AAE000C0817887301E1186FC06094E0E4EC07854 +:10AAF000788E30171186EE0609470E8E998E11DE7C +:10AB0000581ECAD178A7301E1188FC08094E0E4E77 +:10AB1000CACBE3CF80C00000301AF40B094A99CAAF +:10AB20005EFD0000301AF40B094A99DA5EFD000060 +:10AB3000301AF40B094A990A5EFD0000EBCD40C0C3 +:10AB400018961697C78F301BF607094B8D1B6C2B79 +:10AB5000C7CFE3CF80C00000EBCD40C0189616975A +:10AB6000C6AF301BF607094B8D4B6C3BC6EFE3CFEE +:10AB700080C00000EBCD40F81897E0663F98EA16D9 +:10AB800000006D7C580CC091E06C0400ED4C005C42 +:10AB9000ED4C0060ED4C00646D5CFEB0C315189583 +:10ABA0006D8CFEB0C3116DCBFEB0C144E06BF5C33C +:10ABB000EA1B411CFEB0C1B2004720001302F1ECB9 +:10ABC00056040196000080010197000100006521F4 +:10ABD000010D02F1EC560300000001000A9BFEB0DB +:10ABE000C0E5FEB0C2EB18946D6CFEB0C2FF1895C4 +:10ABF0006D9CFEB0C2FB6DDBFEB0C12EE06BF5C3F9 +:10AC0000EA1B411CFEB0C19C0A9BFEB0C0CFFEB047 +:10AC1000C2D518956D4CFEB0C2E918936D7CFEB09C +:10AC2000C2E56DBBFEB0C118E06BF5C3EA1B411C69 +:10AC3000FEB0C186069BFEB0C0B9FEB0C2BF8E1B7F +:10AC4000EE0B001BB62C8E1CEE0C001CB8348E1CB8 +:10AC5000EE0C001CB8458E1C2FFCAE1C8E1C59EC53 +:10AC6000C03531DCAE1CE3CF90F8D70380011D0C5A +:10AC70008001197880011A60800118CC80011CDCE9 +:10AC8000EBCD40E0300BC078F60C1035A36C180704 +:10AC9000AEC62FFBE0670104EA1700003006583B00 +:10ACA000CF45E0653F98EA150000EB460090EF665F +:10ACB00003B1FEB0F881EB4600F4EF6603B2E3CFD8 +:10ACC00080E0D703800188D8D401E06C2558EA1CC5 +:10ACD0000000781CFEB0FCC6F80B151800C55C001F +:10ACE0001302F1EC56040197000080010198000165 +:10ACF0000000F2CA010D02F1EC5603000000010051 +:10AD0000C0505C6CC60C301CC58CDA0A8001918482 +:10AD1000EBCD4080E0672558EA170000E0A0110E57 +:10AD20008F2CE0A011118F1C300CAE8C6E2CE06BC0 +:10AD3000B370EA1B8001F94B02E8E06BB390EA1BA9 +:10AD40008001F94B02ECE06B97ECEA1B8001F94BB8 +:10AD500002F0E06B9878EA1B8001F94B02F4E06B9B +:10AD600098D0EA1B8001F94B02F8E3CF9080D7031B +:10AD70008001BA388001BA44D401E06C2558EA1C3D +:10AD80000000782CF93C02E1580CC021D80AC0DC44 +:10AD9000D8020000D401300CE06B2558EA1B0000FB +:10ADA000B68CC0BCDA0A0000E06B2564EA1B000028 +:10ADB000F72C00005EFC0000E06B2564EA1B00003D +:10ADC000B68C5EFDE06B2558EA1B0000B68C5EFD7C +:10ADD000D401189A301C1789F2091068F4090B0C79 +:10ADE0001789F20910681409B29C317C1789F2099D +:10ADF00010681409B2ACE06C2558EA1C0000F9296F +:10AE000000FDC4001302F1EC56040198000080011B +:10AE1000019900010000B271010D02F1EC5603002E +:10AE2000000001000000178CF80C1068180AB4C963 +:10AE3000178C2FFCB68CCC1FD80A0000EBCD4080BD +:10AE4000218D300C50CC50BC30DA300BFEB0DD8C94 +:10AE5000582CC031302CC5983017E06A2568EA1AA2 +:10AE600000009507FB1C006E50CCFB3C006C50BCF6 +:10AE700040BC581CC051E06C010050BCC1B840BC83 +:10AE8000582CC051E06C020050BCC14840BC583C3A +:10AE9000C051E06C040050BCC0D840BC584CC051FC +:10AEA000E06C080050BCC06840BC585CC031310C3C +:10AEB00050BCFACBFFD4FACCFFD0FEB0C1D9E06CC5 +:10AEC00000B4BACC346CBADCBAE7300CFB6C00349A +:10AED000303CFB6C0035FACCFFC81A9B3249170A8C +:10AEE00018AA2049CFD130ACFB6C0036FB57005C70 +:10AEF000FACCFFCC1A9B32C9190A16AA2049CFD125 +:10AF0000FEB0DDF2CA80301C2E8DE3CD8080D703E9 +:10AF10008001544080011D48D401216D301CFB6C20 +:10AF2000002C303C0087D2001302F1EC560401994A +:10AF300000008001019A0001000027BA010D02F112 +:10AF4000EC56030000000100FB6C002D30ACFB6CE4 +:10AF5000002E301CFB5C0054FACCFFD41A9B32C983 +:10AF6000190A16AA2049CFD1FEB0DDD0C031303C3D +:10AF7000C048FEB0C285301C2EADD802800155C03D +:10AF800080011F34D42118961697E06507FF780CCE +:10AF9000EBEC034C0A3CC0B16C0CF9DCC014C041B2 +:10AFA0006C1C580CC030302CD822DA2A580CC071D6 +:10AFB0000C9CE0A00C63581CC025D82A5817C1056A +:10AFC00018150A37C0D36C0CA17C300AC042F06B54 +:10AFD0000000C048300BEA1B7FF0AD1BDA2AF80BEB +:10AFE00011000E3BC0A46C0BE41B800F1807F7E7A1 +:10AFF00011478D073FFCD822300BEA1B80006C0AFA +:10B00000166A6C09F3D9C014B5A98D09201C18075C +:10B01000300CEEC9FFCBE0490035C0438D0A8D1CD2 +:10B02000D82A30095A17C0642E076C196C088D187D +:10B030008D0C5C37C15058095F19EE0811206C1C4B +:10B04000F808094C18496C1C000F28001302F1EC99 +:10B050005604019A00008001019B00010000980144 +:10B06000010D02F1EC56030000000100F8070A4E42 +:10B070006C0CF808094C184E8D1E6C0CF8070A4C25 +:10B080008D0C6C0C144C8D0C301CEA1C8000183993 +:10B09000C0621639C0C16C1CA19CC0926C1C2FFCF4 +:10B0A0008D1CC0516C0C2FFC8D0CC0786C0C143CAA +:10B0B000C0416C1C580CC9403FFCD8228001B33001 +:10B0C000D431202D14961697E0A00D265C7C187CB8 +:10B0D000C030202CC0410C9A0E9BC6783008300935 +:10B0E0000C9A0E9BFEB0CF8EC052EE1780003083BC +:10B0F000C0283003E06184C8EA118001E0629D54F9 +:10B10000EA1280013005EA153FF0E0683BCEEA180C +:10B11000667FE069A09EEA193FE60C9A0E9BFEB09E +:10B12000CF71C1B20C9A0E9B30080A99FEB0CDAC1B +:10B13000BB1B300A0A9B0C980E99FEB0CD71BB0860 +:10B14000FEB0CEB75D12149816990C9A0E9BFEB005 +:10B15000CEED069C5D11C29830180A990C9A0E9B90 +:10B16000FEB0CF50C1720C9A0E9B300800107D00CB +:10B170001302F1EC5604019B00008001019C0001C8 +:10B1800000008C29010D02F1EC56030000000100C3 +:10B190000A99FEB0CD8BBB1B300A0A9B0C980E9906 +:10B1A000FEB0CD50BB08FEB0CE965D12EC1300028F +:10B1B0000C980E99CDFB321CE06B42B4EA1B0000E8 +:10B1C000970C3FFAE06BFFFFEA1B7FFF2FEDD832B1 +:10B1D0008001B5A8800139BC80013A9480013718FC +:10B1E000800136B080013942B18CF9DCC001EC1C21 +:10B1F00000015EFCEBCD40801897E1BC0000CF5F02 +:10B20000D303FC1BAA00496A950BFE7B1400970729 +:10B21000C020D503E3CF8080EBCD40C01897FE7CE3 +:10B220001404780648DC780CEDBC0005CFC2E1BC04 +:10B230000000CDBFD303304BF607002BEA1BAA005A +:10B24000487A950BA7D6FE7B1404F60709265C5CAA +:10B25000C020D503E3CF80C0FFFF14D4FFFF1458F4 +:10B26000D4211897EE041605FE761420EC0400266F +:10B270006C05E1BC0000CB9F189BD303320CF80493 +:10B28000002CEA1CAA00FE7A1458950C301CEFD74B +:10B2900000AF18001302F1EC5604019C000080017D +:10B2A000019D00010000E691010D02F1EC56030042 +:10B2B00000000100C005F807094C18458D055C5BCE +:10B2C000C020D503D82A0000D4211897EE04160513 +:10B2D000FE761420EC0400266C05E1BC0000C97F5A +:10B2E000D303320BF604002BEA1BAA00FE7A145893 +:10B2F000950B301BEFD7C005F607094B16858D055A +:10B300005C5CC020D503D82A167BC696F9DBC28BBD +:10B31000C440E04C07FFC400E41B000FBB21301900 +:10B32000B5693008124BFE3CFC03A19CC032A17AE7 +:10B330005CFBA36BF7EA13EBA36AF3E91030001B85 +:10B34000F3E9101130001ADCA1995D08F1E9100C45 +:10B35000C160167BC086001AF601014B1000E2099D +:10B360000041C078000AF601004B1010E2090141CB +:10B37000A17A5CFB101AF609014BCE7B167B5F7C31 +:10B38000E00C000A1B0C5C01E20B1601BB015D0A1C +:10B39000B56CF60C000B5EFCF5EB101C5E0CE41BB0 +:10B3A000000FC110F60C1200F80C110BF809112057 +:10B3B000F60C094B00A495001302F1EC5604019D14 +:10B3C00000008001019E00010000735A010D02F18E +:10B3D000EC56030000000100F4090A49124BF40C7A +:10B3E000094AF80C1101CADBF40C1200C030F40950 +:10B3F000094A2EBCF40B160BB57AF80C1101CA1BC6 +:10B40000F5EB101C5E0C3FFCB56C580AF80B1300F2 +:10B410005EBC484C321B990B3FFB3FFA5EFE0000BE +:10B42000000042B4EBCD4080E0672555EA170000EC +:10B430000F8C581CC031E3CF8080E06C2548EA1C9B +:10B440000000781CFEB0EE52581CC051301CC5FCE8 +:10B45000301CAE8CE3CF908080017B10EBCD408020 +:10B46000E0672548EA170000E0A00DD48F2CE0A08B +:10B470000DD78F1C300CAE8C6E2CE06BAF68EA1BC6 +:10B480008001F94B0308E06BAF94EA1B8001F94B94 +:10B49000030CE06B9E4CEA1B8001F94B0310E06B40 +:10B4A0009EECEA1B8001F94B0314E06BB208EA1B27 +:10B4B0008001F94B0318E3CF9080D7038001BA389D +:10B4C0008001BA44D401E06C2548EA1C0000782CC5 +:10B4D000F93C0301580CC0210001F1001302F1EC0A +:10B4E0005604019E00008001019F00010000CCE194 +:10B4F000010D02F1EC56030000000100D80AC11C46 +:10B50000D8020000D401C0DCD8020000D401300C05 +:10B51000E06B2548EA1B0000B68CC0BCDA0A0000CC +:10B52000E06B2554EA1B0000F72C00005EFC0000D5 +:10B53000E06B2554EA1B0000B68C5EFDD421189701 +:10B54000169630053004C0780F9B0F8CC08C1845C0 +:10B550002FE72FF40C34CF930A9CD822189AFE7C44 +:10B560002C00F4091605A9791809588BF9BB0208B3 +:10B570001E0B17EB160F0C2C4054687C90A4B800DF +:10B58000301B149CF9DCC005F60C094B936B93AB94 +:10B5900093EB301CF5DAC005F80A094C932C5EFDDC +:10B5A000301B149CF9DCC005F60C094B935B93AB84 +:10B5B00093EBCF0B301B149CF9DCC005F60C094B48 +:10B5C000936B939B93EBCE6B301B149CF9DCC00503 +:10B5D000F60C094B935B939B93EBCDCB301B149CE8 +:10B5E000F9DCC005F60C094B936B93AB93DBCD2BC9 +:10B5F000301B149CF9DCC005F60C094B00B82C007C +:10B600001302F1EC5604019F0000800101A000012B +:10B610000000538A010D02F1EC5603000000010006 +:10B62000935B93AB93DBCC8B301B149CF9DCC00594 +:10B63000F60C094B936B939B93DBCBEB301B149C69 +:10B64000F9DCC005F60C094B935B939B93DBCB4B6A +:10B650005EFF0000D5E1E067B5A8EA178001109A07 +:10B66000129B5D171895FAEA00045D175815C3542C +:10B67000581CC334401CA17CC092FAEA0004EE1BA3 +:10B680008000FAEB00043084C0283004403CA17CE8 +:10B69000C092FAEA000CEE1B8000FAEB000CEC14EE +:10B6A0000006FAEA000CFAE80004FEB0CD05C082FC +:10B6B000FAEA000CFAE80004FEB0CC92C2E85805A1 +:10B6C000F9BA0700F9BB0700C2A7FAEA0004FAE8D2 +:10B6D000000CFEB0CC85C238582CC041FAEA0004F8 +:10B6E000DE625825C041FAEA000CDE621835F9BA6C +:10B6F0000100F9BB0100C051300A300BEA1B3FF0DA +:10B700004019A1793084F9B402004039A179C032DE +:10B71000EC140006581CC031EC140002089CFEB06A +:10B72000005C7A001302F1EC560401A000008001D5 +:10B7300001A100010000EF3B010D02F1EC560300F6 +:10B7400000000100F1E5DE6280013A94800139BC1D +:10B75000800184C8E1BC0000D3035EFCB18CF9DC3D +:10B76000C001EC1C00015EFCD401CF9FC020D503BA +:10B77000D80A0000D401CEFF320BEA1BAA00FE7AE1 +:10B780001818950BE47B0105489A950BCEEFD80A63 +:10B79000D401CE1F320BEA1BAA00FE7A1818950BB3 +:10B7A000300B483A950BCE1FD80AD703FFFF18205D +:10B7B000D401CD1F364BEA1BAA00FE7A1818950B50 +:10B7C000301B48AA950BCD1FD80A0000D401CC3FEE +:10B7D000364BEA1BAA00FE7A1818950B300B483A34 +:10B7E000950BCC3FD80AD703FFFF1864D401CB3F99 +:10B7F000350BEA1BAA00FE7A1818950B301B48AAD5 +:10B80000950BCB3FD80A0000D401CA5F350BEA1B69 +:10B81000AA00FE7A1818950B300B483A950BCA5FB0 +:10B82000D80AD703FFFF1850D42114961697E06862 +:10B83000DEF7EA18BF29E069F8D8EA193FC2FEB07E +:10B84000CBA4E068005455001302F1EC560401A1AA +:10B850000000800101A2000100007AF0010D02F158 +:10B86000EC56030000000100B3F4EA18CCFEE069D6 +:10B87000991AEA193FC3FEB0CA850C980E99FEB01A +:10B88000CB96E068CB62EA18D968E069466FEA199E +:10B890003FC7FEB0CA770C980E99FEB0CB88E0681F +:10B8A000C9C6EA18DA12E06971C4EA193FCCFEB0E1 +:10B8B000CA690C980E99FEB0CB7AE068E94AEA189A +:10B8C000948AE0694924EA193FD2FEB0CA5B0C9819 +:10B8D0000E99FEB0CB6CE0685FF7EA189997E069C3 +:10B8E0009999EA193FD9FEB0CA4D0C980E99FEB04D +:10B8F000CB5EE06855BCEA185555E0695555EA1924 +:10B900003FE5FEB0CA3FD822800139428001371896 +:10B91000D421F8C7FFF9E017FFFC0E3CC023D82A5A +:10B920005887F9B70308C0482FCCE0A003FDE066B4 +:10B9300042BCEA1600006C0C189B580CC111ECCBF1 +:10B94000FFFC760C580CC1C0780A0E3AC1D2F8CB75 +:10B95000FFFCCF8B74090E39C172F4CBFFFC760A61 +:10B96000580ACF91780CECCB006978001302F1EC07 +:10B97000560401A20000800101A300010000C54B94 +:10B98000010D02F1EC56030000000100FFFCC0387D +:10B99000F4CBFFFC760A183AC05074090E39C06225 +:10B9A000CF8BE0A009BFCD31300B580BCCB0760C5B +:10B9B000780AF4C900080E39C042781A970AC0B84C +:10B9C000F807000997097819760891190E1A76096F +:10B9D000930A9907760B580BC060761A580AC03044 +:10B9E0002FCBC028300B8D0B2FCCD8228001AABCC6 +:10B9F0008001B694EBCD40C020FDFACCFFF0FEB044 +:10BA0000D8E1E06C00A6EA1C0000988B2FFBB80B75 +:10BA1000988B989A143BC3B3300BB80B3007C2F81D +:10BA2000E06C245CEA1C0000781CF91C0186F80715 +:10BA30000A4CA19CC232F9D7B008FEB0E8CDC1E5EE +:10BA4000F806100640DBFC1C42C8FEB0BADDFEB0B2 +:10BA5000BC8DFACBFFF80C0BB60C40EBFC1C42C8BB +:10BA6000FEB0BAD2FEB0BC82FACBFFF80C0BB61C0B +:10BA7000301CFACBFFF81606ACCC2FF75C6758B732 +:10BA8000CD05FAEA0008BB1BFEB0E8BC00009C0034 +:10BA90001302F1EC560401A30000800101A400018F +:10BAA0000000D163010D02F1EC560300000001001B +:10BAB0002F1DE3CF90C0D703800155348001754816 +:10BAC0008001197880011CDC80017574EBCD40C0C9 +:10BAD00018961697301C0F8BF60B1068EC0B0B0C9E +:10BAE0000F8BF60B10680C0BB69C30CB0F8AF40A48 +:10BAF00010680C0AB4ABE06B2464EA1B0000F72A60 +:10BB00000000580AC080302B0F8AF40A10680C0A13 +:10BB1000B4CBC0680F8BF60B10680C0BB6CC0F8B38 +:10BB2000F60B10680C0BB6DC306B0F8AF40A106849 +:10BB30000C0AB4EB0F8BF60B10680C0BB64C300CE8 +:10BB4000FEB0E8040F8BF60B10680C0BB65C300CE3 +:10BB5000FEB0E8060F8BF60B10681606AC6C0F8C67 +:10BB60002FFCAE8C30CCFEB0E821E3CF80C0D703F1 +:10BB700080017498800174AC800174F8D421E0A035 +:10BB80000ABB1897EF260070C178EE060015EF1C6F +:10BB9000006EEB0B0072180BEB5B0072EB04007293 +:10BBA000F9D6B008FEB0E1E01834C045300C28E505 +:10BBB000002C1D001302F1EC560401A400008001CA +:10BBC00001A500010000BBDB010D02F1EC560300F2 +:10BBD00000000100AA0C2FF65C665866CE95E06C5A +:10BBE0003A5CEA1C0000198C580CC2E0EF1C00669D +:10BBF000580CC2A1EF2C006D585CC06128678E0CF8 +:10BC0000580C5F0CD822EF2C006CEF2B0070163C08 +:10BC1000C104EF2C006CC088300B5C6CEE0C001A79 +:10BC200028EAB40B2FFCEF2B0070F60C1800CF5550 +:10BC30000E9C293CF92B0000EE0B001728E78E0C18 +:10BC4000580C5F0CD822D82A8001BA44800168B40D +:10BC5000E1BC0000D3035EFCB18CF9DCC001EC1C3C +:10BC600000015EFCD401CF9FC020D503D80A00009C +:10BC7000D421189716951496CECF3FF48F848FA4B5 +:10BC8000E06B00808F0BCEFF8FA4302AE06B02C0E8 +:10BC9000E06C423CEA1C8000E0A00336E06C429C71 +:10BCA000EA1C00009937315B8F0BEB3B0009580B06 +:10BCB000C0406E0BA1BB8F0BEB3B000A580BC04082 +:10BCC0006E0BBBAB8F0B6E0BEB3A0008F7EA110B58 +:10BCD0008F0B6A0B00B604001302F1EC560401A5A9 +:10BCE0000000800101A6000100002E10010D02F1EC +:10BCF000EC560300000001006A1AF60A0D0A307BB8 +:10BD0000F40B0D0A5C5AB16AA5AA8F2AAD0BB92AA9 +:10BD10000D0A18AAE07C00008F7CD82A8001AC3084 +:10BD2000D401E0690F98EA190000129C2F4C300AE8 +:10BD3000300B189E30A8BD2A2018CFE1129C2F4C42 +:10BD4000189E30A8BD2A2018CFE1129CFE3CFE5C54 +:10BD5000189E30A8BD2A2018CFE1129C2A4C189EAC +:10BD600030A8BD2A2018CFE1129CFE3CFF2C189E63 +:10BD700030A8BD2A2018CFE1129CFE3CFEAC189ED4 +:10BD800030A8BD2A2018CFE1300CB28CB29CB2CCC6 +:10BD9000B2DCB2ACB2BCB2ECB24CB25CE06C400013 +:10BDA000EA1C447EF34C01F4F2EB0124F2EB012C8B +:10BDB000F2EB0134F2EB0144F2EB013CF2EB014C0B +:10BDC000D80A0000300CE06B2120EA1B0000B68C82 +:10BDD0005EFF0000EBCD4080201D3007189B5C5BB0 +:10BDE000201BC060201BC060201BC0E0C058301763 +:10BDF000C0B83027C0983037002988001302F1EC12 +:10BE0000560401A60000800101A70001000091ABCB +:10BE1000010D02F1EC56030000000100500CE06C33 +:10BE2000D030EA1C8001FEB0646F0E9C5C6C2FFD6C +:10BE3000E3CD808080006FE8EBCD40C01896169768 +:10BE4000301C0F8BF60B1068EC0B0B0C0F8BF60BEA +:10BE500010680C0BB69C302C0F8BF60B10680C0B7B +:10BE6000B6ACE06B2120EA1B0000F72C0000CC5F91 +:10BE70000F8BF60B10681606ACCC0F8C2FFCAE8C1B +:10BE8000CB4FE3CF80C00000B18CF9DCC001EC1CCB +:10BE900000015EFCEBCD408048BC7807E1BC0000AF +:10BEA000FEB0FFF4D303350BEA1BAA00FE7A181884 +:10BEB000950BA1C7484B97075C5CC020D503E3CF27 +:10BEC0008080D703FFFF1850D401E1BC0000FEB012 +:10BED000FFDDD303364BEA1BAA00FE7A1818950B38 +:10BEE000301B490A950B5C5CC020D503D80A0000C2 +:10BEF000EBCD408048BC7807E1BC0000FEB0FFC637 +:10BF0000D303364BEA1BAA00FE7A1818950BA1C77B +:10BF1000484B97075C5CC020D503E3CF0095D50064 +:10BF20001302F1EC560401A70000800101A80001F2 +:10BF300000000640010D02F1EC5603000000010074 +:10BF40008080D703FFFF1864D401300CC068F20C66 +:10BF50000029F34B00982FFCE0690754EA19000010 +:10BF6000300B589CCF55E06C08E0EA1C0000991B90 +:10BF7000F34B00FC364A930A931AFC1A4140932A69 +:10BF8000FC1A3E80933A934A935A936A937AE06AF2 +:10BF90003333EA1A3EB3938A305A939A93AA300AFB +:10BFA000C068F20A0028F14B00982FFA589ACFA5E2 +:10BFB000992B993B994B129CFE3CFEF0F34C010CE3 +:10BFC000129CFE3CFEF0300A189E32D8BD2A201882 +:10BFD000CFE19D0A2D49B31B932AD80A782CB98C3E +:10BFE000F9DCC0015EFC0000782CBD8CF9DCC001DE +:10BFF0005EFC0000D421201D18951694149712960B +:10C00000300C500C0A9CCF1FC0F0FEB06273301B86 +:10C01000FEB06574400B2FFB500B400CE04C07D07A +:10C02000CF23300CC0E8A964A1A4EB440040B16761 +:10C030008B070A9CCD4FCFE10C9B0A9CC08C301C17 +:10C04000008182001302F1EC560401A80000800177 +:10C0500001A90001000046FB010D02F1EC560300AE +:10C06000000001002FFDD82280006DB0800073B861 +:10C07000EBCD40C0189616970C9CCC3FCFE18D17A6 +:10C080000C9CCBFFCFE1E3CF80C00000998B5EFD1D +:10C09000D401E06C212CEA1C0000780CF93C022150 +:10C0A000580CC021D80AC07CD8020000D401300C42 +:10C0B000C0ACDA0AE06B2134EA1B0000F72C000068 +:10C0C0005EFC0000E06B2134EA1B0000B68C5EFDD4 +:10C0D000D401189A301C1789F2091068F4090B0C66 +:10C0E0001789F20910681409B29C311C1789F209EA +:10C0F00010681409B2ACE06C2135EA1C0000F92983 +:10C100000000178CF80C1068180AB4C9178C2FFCA3 +:10C11000B68CCCDFD80A0000E06A07FF7809F5E9A1 +:10C1200003491439C0B1780BF7DBC014C051781C37 +:10C13000580CC0215EFF302C5EFC780AF5DAC01F77 +:10C14000C051781A580AC0215EFDE06A04331429F0 +:10C15000161958195E5D300AE0490035C075780B34 +:10C16000E61B8000005D30001302F1EC560401A9CB +:10C170000000800101AA00010000D330010D02F18E +:10C18000EC56030000000100990B991A5EFE30186E +:10C19000F7D9C005F00B09482018A789C092780B81 +:10C1A0001668105B990B781B1648991AC058781BB3 +:10C1B0001668105B991B58083FFCF9BC00005EFC38 +:10C1C000FE792C00F80A1605A97A120A3019F9DC52 +:10C1D000C005F20C0949EDBB0002C042F5490074EC +:10C1E000C038F5490078EDBB0007C1B2169CE21CCF +:10C1F0000180C060F54900A8F54900B8C128169C27 +:10C20000E21C0280C060F54900A4F54900B8C0985E +:10C21000169CE21C0380C050F54900A8F54900B403 +:10C22000EDBB0000C0C2EDBB0001C042F5490054A7 +:10C23000C038F5490058F5490044C038F549004870 +:10C2400095195EFD580C5E0DF8FBFFFC204C588BD9 +:10C250005E3DF5DBC0025E1DE06A42BCEA1A0000EA +:10C2600074195809C030123CC0529919951CC1A8C4 +:10C27000109972185808C0301838CFB372081208D5 +:10C28000103C5E3D1838C06100C494001302F1EC0C +:10C29000560401AA0000800101AB000100006C8B74 +:10C2A000010D02F1EC56030000000100720C160CA7 +:10C2B000930C129CC09872185808C040180B16387E +:10C2C0005E3D9918931C781B580B5E0D7809180970 +:10C2D00016395E1D30099509760A780914099909FD +:10C2E000761B991B5EFD0000EBCD40803007E06CB3 +:10C2F0002464EA1C0000F92B0000580BC061FEB05A +:10C30000E53B581CC02530170E9C5C6CE3CD80804B +:10C31000EBCD40803007E06B2464EA1B0000F72A75 +:10C320000000580AC080E04C00C8C151FEB0E52AA8 +:10C330001897C118E04C00C8C071FEB0E51D582C1C +:10C34000C0A53017C088E04C00C4C051FEB0E51451 +:10C35000581CCF840E9C5C6CE3CD8080800175D42A +:10C36000800175C8EBCD4080E0673E60EA170000B1 +:10C37000FEB0EF10EF4C0104300CC068EE0C002A48 +:10C38000F54B008C2FFC300B589CCF95EF4B0100E8 +:10C39000EF4B00FCFEB0EEE8EF4C0118E06C01F44E +:10C3A0008F0C8F1CFC1C41408F2CE06C00C61400CD +:10C3B0001302F1EC560401AB0000800101AC000156 +:10C3C000000078A3010D02F1EC560300000001000B +:10C3D000999AEA1C3F198F3C8F4C8F5CFC1C3E8065 +:10C3E0008F6C8F7CE06C3333EA1C3EB38F8C307CD7 +:10C3F0008F9C8FACE3CF8080800189E4800189B875 +:10C40000F6091605E068C76CEA188001F0090038E3 +:10C410007018F7DBC005F00B092CFE7C1000F80942 +:10C42000002CE06B4000EA1B8000580AC081E06AE3 +:10C430004128EA1A8000142B990B5EFD581AC0910E +:10C44000E06A4136EA1A8000142BBFAB990B5EFDFF +:10C45000582AC091E06A4144EA1A8000142BBFBBFD +:10C46000990B5EFDE06A4152EA1A8000142BEA1B28 +:10C47000C000990B5EFD0000581C5E5DE06B20BCA7 +:10C48000EA1B0000962A180AB62A962CE04C03E80C +:10C490005E5D962CE02C03E8B62CF72C00022FFCF6 +:10C4A000B6ACF72C0002E04C003C5E5DF72C0002BD +:10C4B00023CCB6ACF72C00012FFCB69CF72C000166 +:10C4C000E04C003C5E5DF72C000123CCB69CF72CC1 +:10C4D00000FD2F001302F1EC560401AC00008001B6 +:10C4E00001AD00010000121B010D02F1EC5603002A +:10C4F0000000010000002FFCB68CF72C0000598CC6 +:10C500005E5D300CB68C5EFDD021E06CD14CEA1C37 +:10C510008001190B190A1909F7EA1008F1D8C002AD +:10C52000C221F2081603C1F0F3D9C003143BC08046 +:10C53000B707B5262018CFD15809C171C0C8300639 +:10C540003007B5262018CFC15809C050300B14CB86 +:10C550002019CFD1E06BD164EA1B8001163CCDA33A +:10C56000D0225EFD143BCF30173814C82019CF30CD +:10C57000CFCB0000EBCD4080E0673828EA17000001 +:10C58000E0A0065C8FAC300CC088F80B10340E0BAA +:10C590002D4BEE0C092B2FFC58ACCF85E0A0048C62 +:10C5A000E0A00540E0A00562FEB0A21CE0A00546A8 +:10C5B000FEB0A002E0A0054EE3CF80808001BA4427 +:10C5C0008001B6C08001B82C8001B8748000F1EC05 +:10C5D0008001B8448000EDC08001B85CEBCD4080A4 +:10C5E000E0672120EA170000E0A006228F2CFEB0B1 +:10C5F0005FDB8F1C00465D001302F1EC560401ADB9 +:10C600000000800101AE0001000087D0010D02F1A1 +:10C61000EC560300000001006E2CE06BB3ACEA1B8B +:10C620008001F94B0048E06BB9C4EA1B8001F94B6B +:10C63000004CE06BB4D4EA1B8001F94B0050E06B76 +:10C64000B710EA1B8001F94B0054E06BA71CEA1BF2 +:10C650008001F94B0058E3CF9080D7038001BA38AE +:10C6600080006DB0EBCD4080E067245CEA170000ED +:10C67000E0A005F08F1CFEB05FA98F0C6E1CE06B74 +:10C68000B3E8EA1B8001F94B0188E06BB944EA1B6F +:10C690008001F94B018CE06BA368EA1B8001F94B28 +:10C6A0000190E06BAB3CEA1B8001F94B0194E06B1D +:10C6B000A41CEA1B8001F94B0198E3CF9080D703BB +:10C6C0008001BA3880006DB0E06C4000EA1C800048 +:10C6D000E3BC00015EFD0000D401CF7F300BC20837 +:10C6E000E069432CEA198000781CF80A09292FFA1E +:10C6F000E06CC76CEA1C8001F80B003C7809123A28 +:10C70000CF03E06A4128EA1A8000E06C4000EA1C8E +:10C710008000181AFE7C100000DDC8001302F1EC46 +:10C72000560401AE0000800101AF00010000386B2B +:10C73000010D02F1EC56030000000100F80B092A7C +:10C740002FFB59FBC032300ACE6BD80AD421189681 +:10C750001697E06B07FF6E0CF7EC034C3005163CA8 +:10C76000C0C1AC056E0CF9DCC014C0416E1C580C85 +:10C77000C030302CD822DA2A581CC0640E9CE0A0AD +:10C7800001F7581CC0C46E0BE41B800FEA1B3FE08E +:10C790008F0BE02C03FEAC0C3FFCD822AC05D82A52 +:10C7A0008001B330D401318A300B300CFEB0D26836 +:10C7B000582CC031302CD802E0A003B6300CE06B0E +:10C7C0002555EA1B0000B68CDA0AD7038001B6E8CB +:10C7D000D401318A300B301CFEB0D252583CC031EB +:10C7E000303CD802300CE06B2555EA1B0000B68CBB +:10C7F000DA0AD70380015440D401E0A0053DE06B84 +:10C800002590EA1B0000970CE06BBA58EA1B8001E8 +:10C81000F94B00C8E06BBA64EA1B8001F94B00CC0D +:10C82000E06BBA74EA1B8001F94B00D0E06BBA5C94 +:10C83000EA1B8001F94B00D4E06BBA68000B2500BD +:10C840001302F1EC560401AF0000800101B00001B9 +:10C8500000002803010D02F1EC5603000000010066 +:10C86000EA1B8001F94B00D8DA0AD7038001BA38F5 +:10C87000D401E0A00513E06B258CEA1B0000970CA7 +:10C88000E06BBA58EA1B8001F94B0168E06BBA64AF +:10C89000EA1B8001F94B016CE06BBA74EA1B800162 +:10C8A000F94B0170E06BBA5CEA1B8001F94B017433 +:10C8B000E06BBA68EA1B8001F94B0178DA0AD7030A +:10C8C0008001BA38EBCD40801897FEB05EA35817B0 +:10C8D000C0905827C0B05837C0D05877C0F0E3CFC9 +:10C8E0009080FEB06193E3CF9080FEB06193E3CF80 +:10C8F0009080FEB0617DE3CF9080FEB06183E3CF96 +:10C900009080D70380006DB0800073A8800073B062 +:10C910008000738C800073A0D401E0A004BFE06BA2 +:10C9200024B0EA1B0000970CE06BBA58EA1B8001A8 +:10C93000F94B0088E06BBA64EA1B8001F94B008C6C +:10C94000E06BBA74EA1B8001F94B0090E06BBA5CB3 +:10C95000EA1B8001F94B0094E06BBA68EA1B800186 +:10C9600000CDD8001302F1EC560401B000008001A4 +:10C9700001B1000100003CBE010D02F1EC560300C4 +:10C9800000000100F94B0098DA0AD7038001BA3899 +:10C99000D5A1E067A9B4EA178001301BFACCFFFCEF +:10C9A0005D175C7C201CC190201CC170300BFACC40 +:10C9B000FFFC5D17C120401CA17CFAE80004300A8E +:10C9C000C052300BEA1BBFF0C048300BEA1B3FF0EF +:10C9D000FEB0C2E6FAEB0004FAEA0004D862D7031C +:10C9E00080013718D401E0A0046BE06B2458EA1BE7 +:10C9F0000000970CE06BBA58EA1B8001F94B014824 +:10CA0000E06BBA64EA1B8001F94B014CE06BBA742D +:10CA1000EA1B8001F94B0150E06BBA5CEA1B800114 +:10CA2000F94B0154E06BBA68EA1B8001F94B0158DD +:10CA3000DA0AD7038001BA38D401E06C08F8EA1C9E +:10CA40000000300B990B991B992B300A995AE06919 +:10CA50000930EA19000030589338993A994A996B8D +:10CA6000997B998B999B99AB99BB99CA99DA129C3E +:10CA70002E4C934C129C2E4C189E32D8BD2A201856 +:10CA8000CFE19D0A002CB4001302F1EC560401B171 +:10CA90000000800101B200010000A975010D02F142 +:10CAA000EC56030000000100B31B932AD80A0000D3 +:10CAB000D401189A301C1789F2091068F4090B0C7C +:10CAC0001789F20910681409B29C318C1789F20990 +:10CAD00010681409B2ACE06C2548EA1C0000F92982 +:10CAE0000000178CF80C1068180AB4C9178C2FFCBA +:10CAF000B68CFEB0EF61D80A8001910CD401FB2CFA +:10CB00000005592CC071FB3B000C300CFEB07CDEE4 +:10CB1000D80A593CC071FB3B000D301CFEB07CD6DE +:10CB2000D80A594CC071FB3B000E302CFEB07CCEB5 +:10CB3000D80A595CC051FB3C000CFEB07CD7D80A27 +:10CB40008000AC208000AC40D401E0A003CBE06BBF +:10CB50002100EA1B0000970CE06BBA58EA1B800129 +:10CB600099ABE06BBA64EA1B800199BBE06BBA74C5 +:10CB7000EA1B800199CBE06BBA5CEA1B800199DB70 +:10CB8000E06BBA68EA1B800199EBDA0A8001BA38D7 +:10CB9000E06B0728EA1B0000970CE06C06A8EA1C73 +:10CBA0000000300A300BB91B00DD9B001302F1ECD2 +:10CBB000560401B20000800101B30001000016CE4E +:10CBC000010D02F1EC56030000000100992A189BA8 +:10CBD0002E0B994B189B2C8B995B189B2B0B996BED +:10CBE000189B298B997B300BF96B000CE06B00FFD5 +:10CBF000F96B000D2F2CB88B5EFD0000780AE61A49 +:10CC00008000301B7809F3D9C0149909C0D1781974 +:10CC10005809C0A1C1087819A178F1E913F8990859 +:10CC2000A1799919201B7808EDB80014CF52F3D8D8 +:10CC3000C01499097809124A990A5EFBD401317A25 +:10CC4000300B300CFEB0D064582CC031302CD802E0 +:10CC5000E0A002EADA0AD7038001B958D401317A98 +:10CC6000300B301CFEB0D054583CC031303CD802A0 +:10CC7000DA0AD70380015440D401302A301B300C2B +:10CC8000FEB0D046582CC031302CD802302A305B50 +:10CC9000300CFEB0D03D582CCF80FEB0652F300C4C +:10CCA000E06B2120EA1B0000B68CDA0A80015440B8 +:10CCB00080007E2CD4019ADCE06B00A6EA1B000009 +:10CCC000B61C582CC055FE3C0002B60C0057E600BE +:10CCD0001302F1EC560401B30000800101B400011D +:10CCE000000002E6010D02F1EC5603000000010015 +:10CCF000C038300CB60C30CAFB3B00085C6B300C03 +:10CD0000FEB0D018583CC031302CD802DA0AD70314 +:10CD100080015440D401310A301B300CFEB0D00ADF +:10CD2000582CC031302CD802E0A002A4DA0AD70374 +:10CD30008001B980D401310A301B301CFEB0CFFA1B +:10CD4000583CC031303CD802DA0AD7038001544045 +:10CD5000D401307A300B300CFEB0CFEC582CC031FF +:10CD6000302CD8021BCCFEB0FF39DA0A8001B2E8C1 +:10CD7000D401307A300B301CFEB0CFDC583CC031CF +:10CD8000303CD802DA0AD70380015440D4A1201DD8 +:10CD90001897500CFAC9FFF8169A1A9BE06CB9FC68 +:10CDA000EA1C8001FEB06C6A300B400AB48BF807B5 +:10CDB0001760C036400C18270E9C2FFDD8A2D70351 +:10CDC00080008D88D40120EDFACCFFF4FEB0D02C89 +:10CDD000FACCFFE8780A500A781A501A782A502AB2 +:10CDE000FEB064E6E06B2120EA1B0000B68C2F2D1C +:10CDF000002E89001302F1EC560401B400008001FA +:10CE000001B500010000685E010D02F1EC5603005F +:10CE100000000100DA0AD7038001553480007EBC8F +:10CE2000FE7B12005C3CF60C002B763CFE7B110076 +:10CE3000F60C032B580B5E0DF60A1200E06BC76C64 +:10CE4000EA1B8001F60C003B761C5C3AF80A002CC9 +:10CE500079FC5EFC488CE3BC0001F01F000AC03086 +:10CE6000F01F0009D743F01F0005F01F0005E9B0CF +:10CE70000002CFEB80004000800182688001B9E4AD +:10CE80008000D6588001AD14E06C136CEA1C0000E1 +:10CE9000300BF94B0938B86BB87B305AF94A09B0F6 +:10CEA000F94B0944300AF94A095CF94A098C998A14 +:10CEB000992AF95B00FAF95B00FC5EFD149C169A56 +:10CEC000E06B07FFF7EA0349F5DAC0141639C0A092 +:10CED0005809C0205EFE580AC031580C5E0D3FEC68 +:10CEE0005EFC580AC031580C5E0F302C5EFC00000E +:10CEF000EBCD4080E06724AAEA170000303A0E9B91 +:10CF0000303CE0693828EA190000722972B9728948 +:10CF10005D19C051006879001302F1EC560401B5A7 +:10CF20000000800101B600010000FD95010D02F135 +:10CF3000EC56030000000100300CAE8CAE9CAEAC91 +:10CF4000E3CF8080EBCD4080340C3007300EA17AE7 +:10CF50005CFB5CFE5CF7103EF2071300C053101E32 +:10CF6000EE090147A1AA201CCF310E991C98E3CDF0 +:10CF700080800000EBCD4080300CE06B3A60EA1B13 +:10CF80000000970CE0673A7CEA170000FEB0E9C8A1 +:10CF90008F1C305C8F0CE3CF9080D703800189E435 +:10CFA000D401C03CDA0A0000D401E0A001E9E06B42 +:10CFB0001FE4EA1B0000970C307BF96B007EF96BD5 +:10CFC000007FF96B0080DA0A8001BA44E06B42B856 +:10CFD000EA1B0000760C580CC0205EFDE06C43A8F4 +:10CFE000EA1C0000970CE06B4BA8EA1B0000E01B5A +:10CFF000FFFC181B990B5EFCEBCD4080E067CADCA0 +:10D00000EA1780010E9B300CFEB0EB3E2DC70E9B45 +:10D01000309CFEB0EB39E3CF8080D70380018D4C8C +:10D02000E06C1E34EA1C0000300B990B991B992B05 +:10D03000E06C1E40EA1C0000002C1B001302F1EC07 +:10D04000560401B60000800101B700010000422E25 +:10D05000010D02F1EC56030000000100991B992B11 +:10D06000993BB88B301BB89B5EFD0000300CE06B29 +:10D070002120EA1B0000762A2BFA158A580AC021C3 +:10D080005EFDF72A0000580AC020301C5C6C5EFC74 +:10D09000103AF20B1300C070F7E9100CF5EC101CFD +:10D0A000104C5EFCF9DBB28B5BFC5E1DF5EB10CC2B +:10D0B0005EFC0000580C5E0DE06B136CEA1B000078 +:10D0C000781AF74A00C4780AF74A00C0984CF75C0F +:10D0D00000C85EFDFE7A2C00F80B1605A97B140B28 +:10D0E000301AF9DCC005F40C094AF74A0048971ACF +:10D0F0005EFD0000F7EC200AC060F7EC100AF40AAD +:10D1000015011C9FEA1AFF00F40C011A5F3A147A09 +:10D110001C9F0000580C5E0DE06B136CEA1B0000B6 +:10D12000F6FB0A08328AB709B928208ACFD1228CA7 +:10D130005EFD0000301A189BF7DBC005F40B094AAE +:10D14000FE7B2C00A59CA97C160CF94A00545EFDC0 +:10D15000D401E06C2120EA1C0000781C00480B0080 +:10D160001302F1EC560401B70000800101B8000180 +:10D170000000D5C5010D02F1EC56030000000100CE +:10D180002BDC198CFEB06354DA0AD70380007EAC26 +:10D19000301A189BF7DBC005F40B094AFE7B2C0004 +:10D1A000A59CA97C160CF94A00585EFDD401E06BE1 +:10D1B000CBC8EA1B8001302CFEB0EA8AD80AD7031C +:10D1C00080018D4CD401E06BCBECEA1B8001303C3C +:10D1D000FEB0EA7ED80AD70380018D4CD401E06B03 +:10D1E000CC34EA1B8001306CFEB0EA72D80AD70357 +:10D1F00080018D4CD401E06BCCA0EA1B8001301C77 +:10D20000FEB0EA66D80AD70380018D4CD401E06BEA +:10D21000CC10EA1B8001307CFEB0EA5AD80AD70352 +:10D2200080018D4CD401E06BCBA4EA1B8001307CE3 +:10D23000FEB0EA4ED80AD70380018D4CD421201DC0 +:10D24000189750071A9B301CE0A000D8CFBBD7031B +:10D250008001BA78E06C08F8EA1C0000300B990BEA +:10D26000991B992B99CB99DB5EFD0000E06B20BCEC +:10D27000EA1B00003069172A18BA2029CFD1206C88 +:10D2800000CB88001302F1EC560401B800008001C5 +:10D2900001B900010000957E010D02F1EC5603007A +:10D2A000000001005EFC0000E06B24AAEA1B000005 +:10D2B000178AB88A179AB89A17ABB8AB5EFD000008 +:10D2C000E06920BCEA190000B28CB29BB2AA300C13 +:10D2D000B22C5EFD5C5BC0382FFC201A580A5E0D34 +:10D2E00019891639CFA15EFCE06C00A6EA1C00008B +:10D2F000301BB81B300BB80B5EFF0000300CE06B2E +:10D300004090EA1B0000B68C971C972C5EFD000035 +:10D31000D021F80B0C06AD3B161C189A0C9BD022A2 +:10D320005EFC0000E06C3F8CEA1C0000300B990BA7 +:10D33000991B992B5EFD00005C5B198A163A5E0C06 +:10D340002FFC580ACFB15EFD189BC0282FFB178A0F +:10D35000580ACFD1162C5EFC300CE06B3A60EA1B09 +:10D360000000970C5EFF0000300CE06B2120EA1BF0 +:10D370000000B68C5EFF0000E06C136CEA1C00003D +:10D38000F8FC09F45EFC0000D401E0A00034D80AE7 +:10D390008001BA4EE06B3C80EA1B0000970C5EFDFA +:10D3A000780AB48B003536009302F1EC560401B9CB +:10D3B0000000800101BA00010003000000007A783B +:10D3C0000B2FFB990B5EFCD401FEB042EDD802801E +:10D3D000003FE4E06B3A5CEA1B0000B68C5EFDD4D3 +:10D3E00001FEB0925FD8028000DEE0E06B2464EAC8 +:10D3F0001B0000B68C5EFDE06C2138EA1C00005E6C +:10D40000FC0000E06C1F5CEA1C00005EFC482FD7AB +:10D410000300008001B8BC302C5EFC5EFD00005EA5 +:10D42000FF00005EFF00005EFD00005EFF00005E8A +:10D43000FD00005EFF00005EFD00B7E2009D02F10E +:10D44000EC560300007C0084000000000000000295 +:10D450000000000400000006000000080000000AB0 +:10D460000000000C0000000E000000100000001280 +:10D470000000001400000017000000190000001B4D +:10D480000000001D0000001F00000021000000231C +:10D490000000002500000027000000290000002BEC +:10D4A0000000002D0000002F0000003100000033BC +:10D4B0000000003500000037000000390000003B8C +:10D4C0000000003D0000003F000000410401BA00E0 +:10D4D00000800101BB00010000D1CF010D02F1EC81 +:10D4E0005603000000010000000043000000460059 +:10D4F0000000480000004A0000004C0000004E0000 +:10D5000000005000000052000000540000005600CF +:10D510000000580000005A0000005C0000005E009F +:10D52000000060000000620000006400000066006F +:10D530000000680000006A0000006C0000006E003F +:10D54000000070000000720000007400000076000F +:10D550000000780000007A0000007C0000007E00DF +:10D5600000008000000082000000840000008600AF +:10D570000000880000008A0000008C0000008E007F +:10D58000000090000000920000009400000096004F +:10D590000000980000009A0000009C0000009E001F +:10D5A0000000A0000000A2000000A4000000A600EF +:10D5B0000000A8000000AA000000AC000000AE00BF +:10D5C0000000B0000000B2000000B4000000B6008F +:10D5D0000000B8000000BA000000BC000000BE005F +:10D5E0000000C0000000C2008B0B001302F1EC56DB +:10D5F0000401BB0000800101BC00010000AB26015A +:10D600000D02F1EC56030000000100000000C40010 +:10D610000000C6000000C8000000CA000000CC00E6 +:10D620000000CE000000D0000000D2000000D400B6 +:10D630000000D6000000D8000000DA000000DC0086 +:10D640000000DE000000E0000000E2000000E40056 +:10D650000000E6000000E7000000E9000000EB0029 +:10D660000000ED000000EF000000F1000000F300FA +:10D670000000F5000000F7000000F9000000FB00CA +:10D680000000FD000000FF00000101000001030098 +:10D6900000010400000106000001080000010A006A +:10D6A00000010C0000010E0000011000000112003A +:10D6B000000114000001160000011800000119000B +:10D6C00000011B0000011D0000011F0000012100DE +:10D6D00000012300000125000001270000012900AE +:10D6E00000012A0000012C0000012E000001300082 +:10D6F0000001320000013400000136000001380052 +:10D700000001390000013B0000013D00C7CB0013C0 +:10D7100002F1EC560401BC0000800101BD000100D3 +:10D7200000C19E010D02F1EC560300000001000053 +:10D7300000013F00000141000001430000014500DD +:10D74000000146000001480000014A0000014C00B1 +:10D7500000014E0000015000000151000001530083 +:10D7600000015500000157000001590000015B0055 +:10D7700000015C0000015E00000160000001620029 +:10D7800000016400000165000001670000016900FC +:10D7900000016B0000016D0000016E0000017000CF +:10D7A00000017200000174000001760000017700A2 +:10D7B0000001790000017B0000017D0000017F0075 +:10D7C0000001800000018200000184000001860049 +:10D7D000000187000001890000018B0000018D001D +:10D7E00000018E00000190000001920000019400F1 +:10D7F00000019500000197000001990000019B00C5 +:10D8000000019C0000019E000001A0000001A20098 +:10D810000001A3000001A5000001A7000001A8006D +:10D820000001AA000001AC000001AE000001AF0041 +:10D83000A278001302F1EC560401BD000080010142 +:10D84000BE000100005455010D02F1EC560300002A +:10D85000000100000001B1000001B3000001B400AC +:10D860000001B6000001B8000001B9000001BB00D2 +:10D870000001BD000001BF000001C0000001C200A6 +:10D880000001C4000001C5000001C7000001C9007B +:10D890000001CA000001CC000001CE000001CF0051 +:10D8A0000001D1000001D3000001D4000001D60026 +:10D8B0000001D7000001D9000001DB000001DC00FD +:10D8C0000001DE000001E0000001E1000001E300D2 +:10D8D0000001E5000001E6000001E8000001E900A8 +:10D8E0000001EB000001ED000001EE000001F0007E +:10D8F0000001F1000001F3000001F5000001F60055 +:10D900000001F8000001F9000001FB000001FD002A +:10D910000001FE00000200000002010000020300FE +:10D9200000020400000206000002080000020900D4 +:10D9300000020B0000020C0000020E0000020F00AB +:10D940000002110000021300000214000002160081 +:10D9500000021700BBE3001302F1EC560401BE0005 +:10D9600000800101BF00010000EBEE010D02F1ECAF +:10D9700056030000000100000002190000021A0016 +:10D9800000021C0000021D0000021F000002200017 +:10D9900000022200000223000002250000022600EF +:10D9A000000228000002290000022B0000022C00C7 +:10D9B00000022E0000022F0000023100000232009F +:10D9C0000002340000023500000237000002380077 +:10D9D00000023A0000023B0000023D0000023E004F +:10D9E0000002400000024100000243000002440027 +:10D9F00000024600000247000002480000024A0000 +:10DA000000024B0000024D0000024E0000025000D8 +:10DA100000025100000253000002540000025500B1 +:10DA2000000257000002580000025A0000025B008A +:10DA300000025C0000025E0000025F000002610064 +:10DA4000000262000002640000026500000266003D +:10DA5000000268000002690000026A0000026C0017 +:10DA600000026D0000026F000002700000027100F1 +:10DA700000027300000274006963001302F1EC56A7 +:10DA80000401BF0000800101C000010000EA86011E +:10DA90000D02F1EC560300000001000000027500C9 +:10DAA000000277000002780000027A0000027B008A +:10DAB00000027C0000027E0000027F000002800065 +:10DAC000000282000002830000028400000286003F +:10DAD000000287000002880000028A0000028B001A +:10DAE00000028C0000028E0000028F0000029000F5 +:10DAF00000029200000293000002940000029600CF +:10DB000000029700000298000002990000029B00AA +:10DB100000029C0000029D0000029F000002A00085 +:10DB20000002A1000002A2000002A4000002A50061 +:10DB30000002A6000002A8000002A9000002AA003C +:10DB40000002AB000002AD000002AE000002AF0018 +:10DB50000002B0000002B2000002B3000002B400F4 +:10DB60000002B5000002B7000002B8000002B900D0 +:10DB70000002BA000002BC000002BD000002BE00AC +:10DB80000002BF000002C1000002C2000002C30088 +:10DB90000002C4000002C5000002C70005ED00132A +:10DBA00002F1EC560401C00000800101C100010037 +:10DBB00000862A010D02F1EC56030000000100006E +:10DBC0000002C8000002C9000002CA000002CB0027 +:10DBD0000002CD000002CE000002CF000002D00003 +:10DBE0000002D1000002D3000002D4000002D500E0 +:10DBF0000002D6000002D7000002D8000002DA00BE +:10DC00000002DB000002DC000002DD000002DE009A +:10DC10000002E0000002E1000002E2000002E30076 +:10DC20000002E4000002E5000002E6000002E80055 +:10DC30000002E9000002EA000002EB000002EC0032 +:10DC40000002ED000002EE000002F0000002F10010 +:10DC50000002F2000002F3000002F4000002F500EE +:10DC60000002F6000002F7000002F8000002FA00CD +:10DC70000002FB000002FC000002FD000002FE00AA +:10DC80000002FF0000030000000301000003020087 +:10DC90000003030000030500000306000003070063 +:10DCA000000308000003090000030A0000030B0042 +:10DCB00000030C0000030D0000030E0000030F0022 +:10DCC000D5BE001302F1EC560401C1000080010131 +:10DCD000C20001000013E1010D02F1EC5603000047 +:10DCE00000010000000310000003110000031300F6 +:10DCF00000031400000315000003160000031700C2 +:10DD0000000318000003190000031A0000031B00A1 +:10DD100000031C0000031D0000031E0000031F0081 +:10DD20000003200000032100000322000003230061 +:10DD3000000324BFF000000000000080000000008D +:10DD40000000008000000000000000000000000053 +:10DD5000000000BFEE9452C0000000BE514E2048AB +:10DD6000000000BCBC6764F8000000000000000078 +:10DD7000000000BFED338120000000BE14DBB38043 +:10DD8000000000BCA3066750000000000000000077 +:10DD9000000000BFEBDCE9D0000000BE5992C308D0 +:10DDA000000000BCB8D3B0800000000000000000FC +:10DDB000000000BFEA8FF970000000BE2810A5C067 +:10DDC000000000BCB0C0BFE8000000000000000080 +:10DDD000000000BFE94C2870000000BE424B1360F9 +:10DDE000000000001F3D001302F1EC560401C200C8 +:10DDF00000800101C300010000AC5A010D02F1ECEA +:10DE000056030000000100BCB8203DC00000000027 +:10DE100000000000000000BFE810FA50000000BE43 +:10DE20002BF65FC0000000BCA7715C9000000000F2 +:10DE300000000000000000BFE6DDFC20000000BE86 +:10DE400054F1F8C0000000BCB9F6E9180000000069 +:10DE500000000000000000BFE5B2C3D0000000BE1B +:10DE60005432E470000000BCB406DB500000000037 +:10DE700000000000000000BFE48EEF10000000BEB4 +:10DE80005262F320000000BC9A872AC00000000004 +:10DE900000000000000000BFE37222B0000000BEDE +:10DEA00056E0E8F0000000BCBD2D35280000000061 +:10DEB00000000000000000BFE25C0A00000000BE9D +:10DEC000418EFAB0000000BCBD6FAE400000000003 +:10DED00000000000000000BFE14C5600000000BE42 +:10DEE0005FCD15F0000000BC901C14000000000085 +:10DEF00000000000000000BFE042BD40000000BE86 +:10DF00005734F93000000000D4D1001302F1EC5670 +:10DF10000401C30000800101C400010000B87201C7 +:10DF20000D02F1EC56030000000100BC931E6CE0F2 +:10DF30000000000000000000000000BFDE7DF5E0F2 +:10DF4000000000BE5E538AB0000000BCAA77DA80F1 +:10DF50000000000000000000000000BFDC819DC048 +:10DF6000000000BE26A2FF00000000BCB0E2576027 +:10DF70000000000000000000000000BFDA8FF96020 +:10DF8000000000BE51810A58000000BCB8605FF07C +:10DF90000000000000000000000000BFD8A89800AA +:10DFA000000000BE457F7A60000000BCA33354D05F +:10DFB0000000000000000000000000BFD6CB0F6092 +:10DFC000000000BE40CB91D0000000BCA01B6D4003 +:10DFD0000000000000000000000000BFD4F6FBA01D +:10DFE000000000BE52CEC598000000BC7E393A0049 +:10DFF0000000000000000000000000BFD32BFEE086 +:10E00000000000BE2B877340000000BC79689200BE +:10E010000000000000000000000000BFD169C04007 +:10E02000000000BE5363F1580000000001F000132F +:10E0300002F1EC560401C40000800101C50001009A +:10E0400000D2CA010D02F1EC56030000000100BC31 +:10E050007C8D43800000000000000000000000BF35 +:10E06000CF5FD880000000BE54831F18000000BCA2 +:10E07000A2423FB00000000000000000000000BF0E +:10E08000CBFC6780000000BE53FFFA60000000BCBC +:10E09000B80DE0500000000000000000000000BFCC +:10E0A000C8A89800000000BE357F7A60000000BC60 +:10E0B000933354C00000000000000000000000BFC7 +:10E0C000C563DC00000000BE54FFD658000000BC51 +:10E0D000906439000000000000000000000000BF54 +:10E0E000C22DADC0000000BE1559A480000000BCC8 +:10E0F000AB4B48E00000000000000000000000BF43 +:10E10000BE0B1A80000000BE5A3CBF50000000BC8D +:10E11000B664B3A00000000000000000000000BFD3 +:10E12000B7D60480000000BE36CFBB40000000BC64 +:10E13000A8CE76800000000000000000000000BFB4 +:10E14000B1BB3280000000BE43002A400000000046 +:10E150006BF8001302F1EC560401C50000800101C8 +:10E16000C6000100004701010D02F1EC560300005A +:10E17000000100BCBD0CC62800000000000000002B +:10E18000000000BFA7739400000000BE593B2B188D +:10E19000000000BCA55DE5C000000000000000001C +:10E1A000000000BF9743EE00000000BE40C3E6A0A1 +:10E1B000000000BCB58D95200000000000000000AC +:10E1C000000000800000000000000080000000004F +:10E1D00000000080000000000000000000000000BF +:10E1E0000000008001071C800106CC8001071C8014 +:10E1F0000106F48001087C8001088C8001084880B9 +:10E2000001071C80010A6480010A1080010A348021 +:10E210000108AC800108E4800109348001071C80FA +:10E22000010AE48001071C800106F480010A748061 +:10E23000010A8480010A948001071C80010AF4808D +:10E2400001071C800106F48001087C8001088C8095 +:10E2500001084880010B4C80010BA480010B6C80ED +:10E26000010BC080010B0480010B2880010848804D +:10E27000010BE000F308001302F1EC560401C600A4 +:10E2800000800101C700010000F8BA010D02F1ECA5 +:10E2900056030000000100800106CC80010C0080C4 +:10E2A0000106F48001087C8001088C800108488008 +:10E2B00001071C800106CC80010C38800106F48027 +:10E2C00001087C8001088C8001084880010C708066 +:10E2D0000106CC80010C70800106F48001087C806E +:10E2E00001088C8001084880010C84800106CC80E4 +:10E2F00001071C80010CA080010B0480010B288009 +:10E3000001084800000001000042C40000000200B3 +:10E310000042C800000001000042D00000000100DF +:10E320000042D400000004000042D80000000400B5 +:10E330000042E800000000000042F8000000010078 +:10E340000042FC000000010000430000000001004A +:10E350000043040000000400004308000000040023 +:10E3600000431800000005000043280000000100E1 +:10E3700000433C0000000800004340000000010092 +:10E380000043600000000000004364000000000043 +:10E39000004368000000000052F1001302F1EC5647 +:10E3A0000401C70000800101C8000100006F510195 +:10E3B0000D02F1EC560300000001000000436C0068 +:10E3C00000000100004370000000010000437400E1 +:10E3D00000000100004378000000010000437C00C1 +:10E3E00000000000004380000000000000438400A3 +:10E3F0000000030000438800000000000043940078 +:10E4000000000000004398000000000000439C0052 +:10E41000000001000043A000000001000043A40030 +:10E4200000000000000000000000000000000000EC +:10E4300000000000000000000000000000000000DC +:10E4400000000000000000000000000000000000CC +:10E4500000000000000000000000000000000000BC +:10E4600000000000000000000000000000000000AC +:10E47000000000000000000000000000000000009C +:10E48000000000000000000000000000000000008C +:10E49000000000000000000000000000000000007C +:10E4A000000000000000000000000000000000006C +:10E4B000000000000000000000000000EC0000135D +:10E4C00002F1EC560401C80000800101C9000100FE +:10E4D000002FEA010D02F1EC5603000000010000DC +:10E4E000000000000000000000000000000000002C +:10E4F000000000000000000000000000000000001C +:10E50000000000000000000000000000000000000B +:10E5100000000000000000000000000000000000FB +:10E52000000000000000000000001E0000002800A5 +:10E530000000320000003C0000014A0000003C00E6 +:10E54000000096000000F00000014F0000004100B4 +:10E5500000009B000000F500000154000000460090 +:10E560000000A0000000FA0000015E000000500062 +:10E570000000AA000001040000001E000000780056 +:10E580000000D20000012C00000019000000730000 +:10E590000000CD00000127000000140000006E0004 +:10E5A0000000C8000001220000000A000000640012 +:10E5B0000000BE0000011800000000000000000084 +:10E5C000000000000000000000000000000000004B +:10E5D000000000000000000000000000000000003B +:10E5E000A9B8001302F1EC560401C9000080010132 +:10E5F000CA00010000BA21010D02F1EC560300002F +:10E600000001000000000000000000000000000009 +:10E6100000000000000000000000000000000000FA +:10E6200000000000000000000000000000000000EA +:10E630000000000000000000000000414C4F462098 +:10E64000256400414C434620256400524C4346203B +:10E65000256400504C4F4620256400504C43462012 +:10E6600025640050414F4620256400504143462018 +:10E6700025640050504F46202564005050434620EA +:10E680002564004558204C4D454C2025640000452C +:10E6900058204C4D435231202564004558204C4DA4 +:10E6A0004352322025642025642025640000004563 +:10E6B00058204C4D43523320256420256420256486 +:10E6C000202564000000004558204C4D4352342062 +:10E6D0002564202564202564202564000000008036 +:10E6E00001125C800114AC800114FC800114FC0058 +:10E6F0000000008001155000000000800116EC00B1 +:10E7000000000000099A001302F1EC560401CA004F +:10E7100000800101CB00010000059A010D02F1EC1F +:10E72000560300000001008001125C8001163C804D +:10E730000116A00000000000000000000000000022 +:10E7400000000000000000000000000000000000C9 +:10E750000000003FE0C152382D73663FF921FB54A1 +:10E76000442D183FF0C152382D73663FF921FB54F8 +:10E77000442D184000C152382D7366400921FB54C6 +:10E78000442D184004F1A6C638D03F534D414320D4 +:10E790002564202564202564000000534D41202578 +:10E7A0006420256420256400000000534D5243205E +:10E7B0002564202564202564000000534D52202547 +:10E7C000642025642025640000000080017D2480F1 +:10E7D000017D8480017DD080017DEC0000000080FF +:10E7E000017E080000000000000000000000008022 +:10E7F00001440C8001447480014498800144BC00B1 +:10E800000000008001455C000000008001467C8023 +:10E8100001481880010CC080010DC480010F0C80DC +:10E82000010F1C80010E3C009D13001302F1EC56F9 +:10E830000401CB0000800101CC0001000011B201F5 +:10E840000D02F1EC5603000000010080010F2C00C6 +:10E8500000000080011180800112348001869880C0 +:10E860000186D08001870080018738000000008089 +:10E87000018774000000000000000000000000801C +:10E88000017A4880017A9C80017AB40000000080FF +:10E89000017978800179800000000080017AB80059 +:10E8A0000000008000E9F08000EA888000EB4C80E6 +:10E8B00000EBC4000000008000EC38000000000005 +:10E8C0000000008000EDB08000EDD48000EEBC8040 +:10E8D00000F0608000F0F0000000008000F1548043 +:10E8E00000F1900000000000000000800059FC8052 +:10E8F000005AE480005B8080005BA800000000807C +:10E90000005BD00000000080006570000000005334 +:10E910007461727420436865636B4C696768744CFA +:10E920007578005374617274204661696C00000050 +:10E9300000000050524F0050726F78695365743D6B +:10E9400025640050726F786952656700373D001387 +:10E9500002F1EC560401CC0000800101CD00010061 +:10E96000007B0A010D02F1EC5603000000010000DB +:10E97000000000436865636B4C696768744C757888 +:10E980002053746F70000053746F70204661696C7F +:10E990000000005354256420530000535420536B4F +:10E9A00069700053542564204600005354256420A8 +:10E9B00043000050310050320000005055500050CC +:10E9C000434B0050535431202564005055503200C1 +:10E9D000000000000400080010002000300040008B +:10E9E00060008000C00100018002000300040008F4 +:10E9F000000000524C204558000000524C25642075 +:10EA0000256420256420256420256400000000532F +:10EA100074617274204779726F2054656D70005371 +:10EA200074617274204661696C000000000000008F +:10EA300000000000000000000000000000000000D6 +:10EA4000000000000000004779726F2054656D706F +:10EA50002053746F70000053746F70204661696CAE +:10EA6000000000414C204558000000414C25640046 +:10EA7000D201001302F1EC560401CD000080010127 +:10EA8000CE00010000EEC1010D02F1EC56030000C2 +:10EA900000010020256420256420256420256400D1 +:10EAA0000000000000000000000000000000000066 +:10EAB0000000000000000000000000000000000056 +:10EAC000000000000000004146203000000000412E +:10EAD00046203100000000000100005669656E6E9E +:10EAE00061000041646F6E69730000000000005314 +:10EAF00054302D310000005354302D3200000043BB +:10EB00006865636B4C696768744C757820496E69F9 +:10EB100074000000000000000000005354205072F8 +:10EB20006F783D2564000000000000000C350000F7 +:10EB300000000C0000000000000000414F2D574570 +:10EB4000000000414F500045494332205400004529 +:10EB50004943322D5300000000000041432D57452A +:10EB600000000041434C006E616E004E414E006952 +:10EB70006E6600494E4600524D20256420256420D3 +:10EB80002564202564000052462031000000005218 +:10EB9000462032003017001302F1EC560401CE007B +:10EBA00000800101CF00010000517A010D02F1EC5B +:10EBB00056030000000100000000004144202564CD +:10EBC000202564202564202564000000000000004A +:10EBD000000000000000000000000050443A496EB0 +:10EBE00050465430393232000000004779726F20AD +:10EBF00054656D7020496E6974000050443A20538A +:10EC0000746172745065646F000000455820504470 +:10EC1000524D4D20433120256400000000000000CB +:10EC20000000004C75784300000000455820504417 +:10EC3000524D4D2043332025640000455820504458 +:10EC4000524D4D204332202564000050443A7074E8 +:10EC50002025640000000049522025642C25640012 +:10EC6000000000534F31203078257820000000004C +:10EC700000000047657374526567005445524D208B +:10EC80002564202564000049524F45202564202535 +:10EC9000640000534D524120256420256400004942 +:10ECA0005245202564202564000000495745202551 +:10ECB0006420256400000000A1E2001302F1EC567C +:10ECC0000401CF0000800101D000010000411201C9 +:10ECD0000D02F1EC560300000001004745204355AA +:10ECE00020256400000000436C6F736520256420BC +:10ECF0002564004F70656E202564202564000000A7 +:10ED000000000000000000000000004C4D43505384 +:10ED1000203120256400000000000000061A801841 +:10ED200000000000000000474620310000000053B2 +:10ED3000544D2D4900000000000000000000004973 +:10ED40006E6974000000005254432D5300000015FA +:10ED50000114011105240400000000505243005327 +:10ED6000746F700000000053746172740000004AF8 +:10ED7000415254203200001401150104010506001F +:10ED800000000047454F0000000000474543005287 +:10ED9000462032000000004558542D530000005317 +:10EDA00041442025642000000000000000000053C2 +:10EDB000544D2D52000000542D4558000000000015 +:10EDC0000000000000000053544D2D4200000000E0 +:10EDD00000000041494F0053544D2D00960A008019 +:10EDE00002F1EC560401D00000800101D1000100C5 +:10EDF00003000000004941000000000000004149FC +:10EE000043000000000000000000686A6C747A4C47 +:10EE10000000534149000000000000000000000114 +:10EE200000000000000000000000000000000000E2 +:10EE300000000000000000000000010000010003CD +:10EE400000004C0018000006900000069000003CF6 +:10EE5000348001D16800000008000006840061B61B +:10EE600000B102F1EC56030000680098FFFFFFC4F8 +:10EE70000000003CFFFFFFC40000003CFFFFFFC498 +:10EE80000000003CFFFFFFC40000003C0000000049 +:10EE90000000000000000000000000010000000071 +:10EEA000000000000033F2FF00007070707000007E +:10EEB00005060708090A0B0E0C0D00000853923CCA +:10EEC0000001000000000000000000000000000041 +:10EED0000000000000000000000000000000000032 +:10EEE000100000003F6666663F4CCCCD000000007D +:10EEF000000000010000000100000001000000010E +:10EF0000000000000401D10000800101D2000100D6 +:10EF1000002315010D02F1EC560300000001000171 +:10EF2000010000003C00000001000500000000009E +:10EF300000010000000000000000000000000000D0 +:10EF400000000000000000000000000000000000C1 +:10EF500000000000000000000000000000000000B1 +:10EF600000000000000000000000000000000000A1 +:10EF70000000000000000000000000000000000190 +:10EF80002C00000000000000000000000000000055 +:10EF90000000000000000000000000000000000071 +:10EFA0000000000000000000000000000000000061 +:10EFB0000000000000000000000000000000000051 +:10EFC0000000000000000000000000000000000041 +:10EFD0000000000000000000000000000000000031 +:10EFE0000000000000000000000000000000000021 +:10EFF0000000000000000000000000000000000011 +:10F000000000000000000000000000000000000000 +:10F0100000000000000000000000000000000000F0 +:10F020001E90001302F1EC560401D2000080010191 +:10F03000D3000100007FDF010D02F1EC5603000058 +:10F0400000010000000000000000000000000000BF +:10F0500000000000000000000000000000000000B0 +:10F0600000000000000000000000000000000000A0 +:10F07000000000000000000000000000000001008F +:10F08000010000000000000000000000000000007F +:10F09000000000000000000000000000000001006F +:10F0A0000000000000000000000000000000000060 +:10F0B0000000000000000000000000000000000050 +:10F0C0000000000000000000000000000000000040 +:10F0D0000000000000000000000000000000000030 +:10F0E0000000000000000000000000000000000020 +:10F0F0000000000000000000000000000000000010 +:10F1000000000000000000000000000000000000FF +:10F1100000000000000000000000000000000000EF +:10F1200000000000000000000000000000000000DF +:10F1300000000000000000000000000000000000CF +:10F14000000000004D4A001302F1EC560401D30008 +:10F1500000800101D4000100006BF7010D02F1EC09 +:10F160005603000000010000000000000000000045 +:10F17000000000000000020002000000000000008B +:10F18000000000000000000000000000000000007F +:10F19000000000000000010000000200000000006C +:10F1A0000000000000000000000000000000470018 +:10F1B000000000000000000000000000000001004E +:10F1C000000010000000000000000000000000002F +:10F1D0000000000000000000000001000000C80066 +:10F1E000000004000000000000000000000000001B +:10F1F000000000000000000000000000000000000F +:10F2000000000000000000000000000000000000FE +:10F2100000000000000000000000000000000000EE +:10F2200000000000000000000000000000000000DE +:10F2300000000000000000000000000000000000CE +:10F2400000000000000000000000030000000000BB +:10F2500000000000000000000000000000000000AE +:10F2600000000000000000005EAC001302F1EC564C +:10F270000401D40000800101D500010000014F010C +:10F280000D02F1EC56030000000100000000000038 +:10F29000000000000000000000000000000000006E +:10F2A000000000000000000000000000000000005E +:10F2B000000000000000000000000000000000004E +:10F2C000000000000000000000000000000000003E +:10F2D000000000000000000000000000000000002E +:10F2E000000000000000000000000000000000001E +:10F2F000000000000000000000000000000000000E +:10F3000000000000000000000000000000000000FD +:10F3100000000000000000000000000000000000ED +:10F3200000000000000000000000000000000000DD +:10F3300000000000000000000000000000000000CD +:10F3400000000000000000000000000000000000BD +:10F3500000000000000000000000000100000000AC +:10F360000000010100000000000002000000000099 +:10F37000000000000000000000000001000000008C +:10F38000000002000000000000000000054E001315 +:10F3900002F1EC560401D50000800101D600010005 +:10F3A000009484010D02F1EC5603000000010000FE +:10F3B000000000000000000000000000000000014C +:10F3C00000000000000000000000003FC99999996A +:10F3D00099999A3FE33333333333333FE99999991A +:10F3E00099999A3FF3333333333333400333333311 +:10F3F0003333333FE3333333333333000000000020 +:10F4000000000000000000000000000000000000FC +:10F410000000000000000A000000070000000700D4 +:10F4200000000500000014000002000000000100C0 +:10F43000000001E0071F00000000000000000200C3 +:10F4400000000000000000609C7866805DEFC8311D +:10F45000FF0000800148C40000000003000000001D +:10F46000000000000000000000000000000000009C +:10F47000000000000000000000000000000000008C +:10F48000000000000000000000000000000000007C +:10F4900000000000000000000000000000059000D7 +:10F4A000000000000000000000000000000000005C +:10F4B000F5A6011102F1EC560401D600008001010D +:10F4C000D70001000300000000EC00000000000075 +:10F4D000000000000000000000000000000000002C +:10F4E000000000000000000000000000000000001C +:10F4F000000000000000000000000000000000000C +:10F5000000000000000000000000000000000000FB +:10F5100000000000000000000000000000000000EB +:10F5200000000000000000000000000000000000DB +:10F5300000000000000000000000000000000000CB +:10F5400000000000000000000000000000000000BB +:10F5500000000000000000000000000000000000AB +:10F56000000000000000000000000000000000009B +:10F57000000000000000000000000000000000008B +:10F58000000000000000000000000000000000007B +:10F59000000000000000000000000000000000006B +:10F5A000000000000000000000000000000000005B +:10F5B0000000000000000401D70000800101D80015 +:10F5C00001000058A6010702F1EC560101D9000123 +:10F5D000000101DA0001000101DB0001000101DC92 +:10F5E0000001000101DD0001000101DE0001000158 +:10F5F00001DF0001000101E00001000101E1000163 +:10F60000000101E20001000101E30001000101E449 +:10F610000001000101E50001000101E60001000117 +:10F6200001E70001000101E80001000101E900011A +:10F63000000101EA0001000101EB0001000101EC01 +:10F640000001000101ED0001000101EE00010001D7 +:10F6500001EF0001000101F00001000101F10001D2 +:10F66000000101F20001000101F30001000101F4B9 +:10F670000001000101F50001000101F60001000197 +:10F6800001F70001000101F80001000101F900018A +:10F69000000101FA0001000101FB0001000101FC71 +:10F6A0000001000101FD0001000101FE0001000157 +:10F6B00001FF000100030000FC000448E793DF04A1 +:0EF6C00001FF000080070016D1480200D4E4CC +:00000001FF